参考链接: C++程序显示两个间隔之间的阿姆斯壮数
题目描述
编写一个程序,读入两个正整数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;
}