阿姆斯壮的数字。失败 153
Armstrong numbers. Fails for 153
一个 C++ 程序,用于计算和显示 100 到 999 之间的所有阿姆斯特朗数(每个数字的总和的位数次方等于该数)。答案应该是 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;
}
这似乎不是您的最佳选择:
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
>
#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;
}
一个 C++ 程序,用于计算和显示 100 到 999 之间的所有阿姆斯特朗数(每个数字的总和的位数次方等于该数)。答案应该是 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;
}
这似乎不是您的最佳选择:
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
>
#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;
}