a040: 阿姆斯壯數

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 '')

相關文章