【问题标题】:Armstrong numbers. Fails for 153阿姆斯特朗数字。失败 153
【发布时间】:2020-01-01 10:33:40
【问题描述】:

一个 C++ 程序,用于计算和显示介于 100 和 999 之间的所有 Armstrong 数字(数字的每个数字之和等于数字的幂次方)。答案应该是 153、370、 371, 407。它打印除了 153 之外的所有内容。

已完成调试以查看 i = 153 的各个数字的值。

#include <iostream>
#include <vector>
#include <math.h>

void separateDigits(int n, std::vector<int>& digits)
{
    if (n>0)
    {
        separateDigits(n/10, digits);
        digits.push_back(n%10);
    }
}

int main()
{
    for (int i = 100; i <= 999; i++)
    {
        std::vector<int> test;
        separateDigits(i, test);

        int powerSum = 0;
        for (auto iter = test.begin(); iter != test.end(); iter++)
        {
            //powerSum = powerSum + pow((*iter),3);
            powerSum = powerSum + (*iter)*(*iter)*(*iter);
        }

        if (i==powerSum)
        {
            std::cout << "Armstrong: " << i << std::endl;
        }

    }


    return 0;
}

【问题讨论】:

  • 我看到了 153 printed
  • pow 是一个浮点函数,因此会有舍入误差。为什么不使用纯整数乘法,如*iter * *iter * *iter
  • 你的代码对我来说完全没问题!
  • 奇怪。对我不起作用,屏幕截图已添加到帖子中。

标签: c++ loops number-theory


【解决方案1】:
#include <stdio.h> //PROGRAM TO FIND ARMSRONG NUMBERS.
#include <math.h>  //WORKS ONLY FOR THREE DIGIT NUMBERS.

int main()
{
int num, dig1, dig2, dig3;
for (num = 1; num <= 999; num++)
{

    dig3 = dig2 = dig1 = 0;
    dig3 = num % 10;
    dig2 = ((num - dig3) % 100) / 10;
    dig1 = (num - (dig3 + 10 * dig2)) / 100;
    if (num == pow(dig1, 3) + pow(dig2, 3) + pow(dig3, 3))
    {
        printf("%d\n", num);
    }
}
return 0;
}

【讨论】:

  • 不要将pow 用于ints。
【解决方案2】:

这似乎不是您的最佳选择:

powerSum = powerSum + (*iter)*(*iter)*(*iter);

因为您现在已经嵌入了之前的常量 3

powerSum = powerSum + pow((*iter),3);

以一种更加晦涩难懂的方式。为什么不考虑一种更简洁的方式,它也支持除三位数以外的大小数:

    unsigned digitsSize = test.size();

    for (auto iter = test.begin(); iter != test.end(); iter++)
    {
        unsigned power = 1;

        for (unsigned size = 0; size < digitsSize; size++) {
            power *= *iter;
        }

        powerSum += power;
    }

完整代码:

#include <iostream>
#include <vector>

void separateDigits(unsigned number, std::vector<unsigned>& digits)
{
    while (number > 0)
    {
        digits.push_back(number % 10);
        number /= 10;
    }
}

int main()
{
    std::vector<unsigned> digits;

    for (unsigned number = 100; number <= 999; number++)
    {
        separateDigits(number, digits);

        unsigned powerSum = 0, digitsSize = digits.size();

        for (std::vector<unsigned>::iterator iter = digits.begin(); iter != digits.end(); iter++)
        {
            unsigned power = 1;

            for (unsigned size = 0; size < digitsSize; size++) {
                power *= *iter;
            }

            powerSum += power;
        }

        if (number == powerSum)
        {
            std::cout << "Armstrong: " << number << std::endl;
        }

        digits.clear();
    }

    return 0;
}

将范围从 100 - 999 更改为 1000 - 9999,不再破坏代码,而是产生:

> ./a.out
Armstrong: 1634
Armstrong: 8208
Armstrong: 9474
> 

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 2022-11-13
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多