面向对象程序设计——计算阿姆斯特朗数(C++)

参考链接: 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;

}