【发布时间】:2023-03-22 08:13:01
【问题描述】:
我正在尝试打印出遵循特定规则的前几个数字:可以将其数字的总和提高到整数幂以得到数字本身。 (基本上,如果总和是数字的 n 次方根)。
例如,数字81中的数字和是9,9^2是81。
这是我正在使用的一些代码:
#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <math.h>
using namespace std;
int sumOfDigits(int num) {
int sum = 0;
string numStr = "";
stringstream s;
s << num;
s >> numStr;
for (int i = 0; i < numStr.length(); i++) {
int ad = 0;
stringstream ss;
ss << numStr[i]; // take each digit
ss >> ad;
sum += ad; // and add to sum
}
return sum;
}
int num = 10; // starting number
int numFound = 0; // how many such special numbers have been found
int main() {
while (numFound < 5) {
int sum = sumOfDigits(num);
double exp = log10(num) / log10(sum);
if (fmod(exp, 1.0) == 0.0 && sum != 1) { // if the exponent is an integer
cout << num << "\t" << sum << endl; // then print out the number and the sum of its digits
numFound++;
}
num++;
}
return 0;
}
当我运行它时,我得到以下输出:
81 9
2401 7
4913 17
5832 18
17576 26
第二个条目应该是512 和8,因为 8^3 是 512。我不明白为什么测试适用于某些数字但不适用于其他数字。
我也尝试过其他方法来测试指数是否为整数。我已经针对floor() 表达式对其进行了测试,并尝试使用(int) 转换整个表达式。
我可能错了,问题可能不在那个地方,但如果你能帮助我,我将不胜感激。谢谢。
【问题讨论】:
-
log10(num) / log10(sum)=>log(num) / log(sum)会更快,因为任何碱基的对数都将在内部基于自然对数计算 -
处理整数时,最好保持在整数域内,而不是转换为浮点数。舍入错误可能会很痛苦。在这种情况下,需要使用不同的算法。