2022.12.07 PM 04:00 by CBJ
來源 : https://zerojudge.tw/ShowProblem?problemid=a040 出題者 : jiangsir 標籤 : 數學、窮舉法 難易度 : 1
解題想法 : 這題可以直接使用枚舉法解決。 對於輸入的N,M,可以直接跑一個for i從N~M,並每次判斷i是否為阿姆斯壯數即可。 關於判斷會建議寫成一個函式isarm(i),用於計算並判斷i是不是阿姆斯壯數,實作即為將(每位數)的(位數)次方加總(取得a的n次方,C/C++使用pow(a,n),Python使用a**n),並回傳是否等於i,對於每個i,只要isarm(i)回傳True,就直接輸出i+空白。 計算位數可以先copy一個i給tmp,再一直除10直到tmp為0為止,除的次數即為位數。 取得每位數則是一直將tmp除10,每次取得tmp%10的值就是每個位數的值。 此外,還要判斷區間內是否有阿姆斯壯數,來決定最後是否需要輸出none。 ※Python的isarm()也可以直接傳入字串,即可直接透過len()取得位數。
//C language
#include<stdio.h>
#include<math.h> //pow()
int N,M,len;
int isarm(int n){
int cnt=0,tmp=n,check=n,ans=0;
while(tmp){
cnt++;
tmp/=10;
}
while(n){
ans+=pow(n%10,cnt);
n/=10;
}
if(ans==check)return 1;
return 0;
}
int main()
{
scanf("%d%d",&N,&M);
int ok=0;
for(int i=N;i<=M;i++){
if(isarm(i)){
ok=1;
printf("%d ",i);
}
}
if(!ok)printf("none");
printf("\n");
return 0;
}

//C++ language
#include<iostream>
#include<cmath> //pow()
using namespace std;
int N,M;
bool isarm(int n){
int cnt=0,tmp=n,ans=0;
while(tmp){
cnt++;
tmp/=10;
}
tmp=n;
while(tmp){
ans+=pow(tmp%10,cnt);
tmp/=10;
}
if(ans==n){
return 1;
}return 0;
}
int main()
{
cin>>N>>M;
bool ok=false;
for(int i=N;i<=M;i++){
if(isarm(i)){
ok=true;
cout<<i<<" ";
}
}
cout<<((!ok)?"none\n":"\n");
return 0;
}

## Python language
N,M=map(int,input().split())
def isarm(s):
ans=0
for i in s:
ans+=int(i)**len(s)
return ans==int(s)
ok=False
for i in range(N,M+1):
if(isarm(str(i))):
ok=True
print(i,end=' ')
print("none" if not ok else '')
