close
內容
所謂 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; }
全站熱搜