题目描述

编写一个程序,读入两个正整数a和b,其中a<=b, 计算并输出闭区间[a,b]中的阿姆斯特朗数。阿姆斯特数为各个数位上数字的立方和等于其自身的数字,例如:

153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3 // 153 is an Armstrong number.
12 is not equal to 1 * 1 * 1 + 2 * 2 * 2 // 12 is not an Armstrong number.
【输入形式】

输入为两个正整数(在问题描述中记作a和b,程序中请自定变量名),a和b使用1个空格分隔。

【输出形式】

输出闭区间[a,b]中的所有阿姆斯特朗数。

数据之间用换行符分隔。

最后的一行输出后面无换行符。

如果输入错误,输出提示信息error。

如果没有找到阿姆斯特朗数,输出提示信息no。

【样例输入1】

100 400
【样例输出1】

153
370
371
【样例输入2】

-6 7
【样例输出2】

error
【样例输入3】

12 12
【样例输出3】

no
【样例说明】

不要显示多余的提示信息,避免输出判定错误。

注意判断输入信息是否符合要求。

解题思路

阿姆斯特朗数也就是水仙花数,这种题型比较常规,关键是掌握如何得到一个整数的每一位。那么如何得到呢?比如对于整数1234,要想获得个位上的数字只需要 1234 % 10 = 4 1234\%10=4 1234%10=4,但是十位上的数字该怎么办?这个时候只需要将1234整体右移一位即可,即整体减小十倍 1234 / 10 = 123 1234/10=123 1234/10=123,这个时候,再求新的个位数即可。

代码如下:

#include <iostream>

using namespace std;
void findam(int a,int b){
    int j,k;
    int tem_sum;
    int tem;
    int tem_i;
    int all[100];//由于输出格式的要求,需要存储每一个阿姆斯特朗数
    int n=0;//统计阿姆斯特朗数的个数
    for(int i=a;i<=b;i++){//遍历区间内的每一个数
        j=10;
        tem_sum=0; //统计立方和
        tem_i=i;
        while(tem_i>0){
            tem = tem_i%j;
            tem_sum += tem*tem*tem;
            tem_i/=j;
        }
        if(i==tem_sum){//若立方和与原数相同,则该数为阿姆斯特朗数
            all[n++]=i;
        }
    }
    if(n==0) //按照题目所给条件输出
        cout<<"no";
    else{
        cout<<all[0]; 
        for(k=1;k<n;k++){
            cout<<endl<<all[k];
        }
    }

}

int main()
{
    int a,b;
    cin>>a;
    cin>>b;
    if(a<=0||b<=0||a>b)//若输入的a、b不满足为正整数且a<=b,则输出错误
        cout<<"error";
    else{
        findam(a,b);
    }
    return 0;
}