题目描述
编写一个程序,读入两个正整数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; }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647