用c++查找阿姆斯特朗数

Finding Armstrong Number using C++

本文关键字:阿姆斯特朗 查找 c++      更新时间:2023-10-16

我正在编写一个程序,用于查找给定的数字是否为阿姆斯特朗数:

int main()
{
    int n,rem,sum=0;
    cout<<"Enter the Number for checking"<<endl;
    cin>>n;
    while(n!=0)
    {
        rem=n%10;
        sum=sum+(rem*rem*rem);
        n=n/10;
    }
    if(sum==n)
    {
        cout<<"Armstrong Number"<<endl;
    }
    else
    {
        cout<<"It's not a armstrong number";
    }
    return 0;
}

当我运行它时,无论输入什么,它总是报告" it 's not a armstrong number"。

我将代码修改如下,得到了正确的结果。但是我不明白为什么我需要将输入赋值给n1并进行操作-为什么我不能直接对n进行操作?

int main()
{
    int n,rem,sum=0,n1;
    cout<<"Enter the Number for checking"<<endl;
    cin>>n;
    n1=n;
    while(n1!=0)
    {
        rem=n1%10;
        sum=sum+(rem*rem*rem);
        n1=n1/10;
    }
    if(sum==n)
    {
        cout<<"Armstrong Number"<<endl;
    }
    else
    {
        cout<<"It's not a armstrong number";
    }
    return 0;
}

if (sum==n)行中,程序比较sumn。在第二个程序中,n是用户输入的初始号码。但在第一个程序n==0(见上面的循环)。

因此,在第一个程序中,检查if (sum==n)作为if (sum==0)工作。但是sum的值从来不是0(除非用户输入0),所以第一个程序总是返回"It's not a armstrong number"

关于风格:使用函数而不是将整个逻辑放入一个main()函数中要好得多。例如,您可以创建一个函数,用于计算检查阿姆斯特朗数的中间和:

int getSumOfCubesOfDigits(int n)
{
    int sum = 0;
    while (n)
    {
        const int rem = n % 10;
        sum += rem * rem * rem;
        n = n / 10;
    }
}

在这种情况下,你的程序将更简单,并且将很难犯你在问题的第一个程序中犯的错误:

int main()
{
    int n;
    cout << "Enter the Number for checking" << endl;
    cin >> n;
    if(getSumOfCubesOfDigits(n) == n)
        cout<<"Armstrong Number"<<endl;
    else
        cout<<"It's not a armstrong number";
    return 0;
}

在第一个程序中,将原始数字输入'n'。你的逻辑中唯一的问题是,你忘记了当你退出while循环时,'n'将不再是你的原始数字,因为你重复地做n=n/10,因此'sum==n'即使对阿姆斯特朗数也永远不满足。

因此,在进入while循环之前,将原始数字保存到另一个变量中,例如n1(正如在您提供的第二个程序中所做的那样),并且只使用n1进行操作,即n1=n1/10。不考虑n,这样'n'最终仍然包含原始数字,您可以最终将其与'sum'进行比较以找到您的答案。

你比较哪个数字?,在while循环的第一个程序中,n值被改变(在这个变量中你得到输入),最后用sum == n检查,所以它总是得到条件失败。

因此需要temp (n1)变量来比较最终结果

你的代码在第二个代码块中是不同的,你仍然在测试是否sum=n。

在第二个代码块中,如果测试if(sum=n1),我怀疑它的工作原理是一样的。

我得到了这个解决方案来寻找阿姆斯特朗数

int main() {
    for (int i=10; i<=9999; i++) {
        int k = i,z = 1, s = 0, n = i;
        while ((k/=10) > 0) z++;
        for (int t = z; t; t--, n/=10) {
            s += pow(n % 10, z);
        }
        if (i == s) cout << i << endl;
    }
    return 0;
}