內容
所謂 Armstrong number 指的是一個 n 位數的整數,它的所有位數的 n 次方和恰好等於自己。
如;1634 = 14 + 64 + 34+ 44
請依題目需求在一定範圍內找出該範圍內的所有 armstrong numbers.
輸入說明 輸出說明
輸入包含兩個數字n, m(n<m, n>0, m<=1000000) 將所有範圍內的 armstrong number 依序由小到大輸出
,代表所有尋找 armstrong number 的範圍 ,如果沒有找到請輸出 none.
c++解法
感謝 羊貓貓===以上大大--以下新手=== 的分享
https://zerojudge.tw/ShowThread?postid=8858&reply=0
以下程式碼是我重新打一次的並加上我的理解,大家請先去看 羊貓貓===以上大大--以下新手=== 寫的。
#include <iostream>
using namespace std;
//自建一個函式
int pow(int in1,int in2)//用的時候直接打 pow(in1,in2) in1,in2,為所要計算的變數
{
int out=1;
while(in2--)
{
out*=in1;//計算該位數數字 乘上 位數的次方數
}
return out;//返回out的值 也就是最後pow的值
}
int main()
{
int in1,in2;
while(cin>>in1>>in2)
{
int count=0;
//用k來判斷位數
for(int i=in1;i<=in2;i++)
{
int cn1=i ,k=1;
while(cn1/=10)//每執行一次while cn1會除10 直到cn1剩下個位數
{
k++;
}
int sum=0;
cn1=i;
//把各個位數乘上次方數 並用sum做加總
while(cn1)//此用法跟上一個while相似 但會多做一次
{
sum+=pow(cn1%10,k);
cn1/=10;
}
//比較是否為阿姆斯壯數
if(sum==i)
{
cout<<sum<<" ";
count++;//如果指定範圍內無阿姆斯壯數則 count保持0
}
}
//指定範圍內無阿姆斯壯數
if (count==0)
{
cout<<"none";
}
cout<<endl;
}
return 0;
}
心得
雖然自己也有寫出來,但計算太慢,所以只好看別人怎麼寫。
看了才知道原來有這種方法知道int有幾位數,還有while的其他用法。
這個是我一開始寫的,單純做紀錄。
//一開始的思考方式(雖然解得出來,但會超花時間,所以就是個錯誤的解法)
//利用string的長度判斷幾位數 所以
//先int 轉 string 之後一個一個轉回int 再乘幾次方
//可能是轉來轉去導致太慢
#include <iostream>
#include <string>
#include <math.h>
#include<sstream>
using namespace std;
int main ()
{
string str1,str2;
stringstream stm;
int n1,n2=0,n3,n4,n5,n6=0;
while(true)
{
cin>>n4>>n5;
for(int t=n4;t<=n5;t++)
{
stm.str("");
stm<<t;
str1=stm.str();
for(int i=0;i<str1.length() ;i++)
{
istringstream is(str1);
is>>n3;
n1=str1[i]-'0';
n2=n2+pow(n1,str1.length());
}
if(n2==n3)
{
cout<<n2<<endl;
n6=n6+1;
}
str1.clear();
n2=0;
}
if(n6==0)
{
cout<<"none"<<endl;
}
}
return 0;
}
文章標籤
全站熱搜
