刚才我用C ++编写了一个简单的函数来确定一个数字是否是自恋的,我偶然发现了一些最特殊的东西。对于数字9800817和9926315,我在函数“IsNumberNarcissistic”中获得了错误的总和,这两者都是自恋的。我得到的总和总是比它应该少1,这些数字分别是9800816和9926314。但是,将变量sum声明为double可以解决问题。
所以我的问题是,这里发生了什么?是代码:阻止相关问题,还是其他什么?我正在使用Code:Blocks 13.12。提前谢谢。
PS。不要介意我在函数中创建的那些打印,我只是把它们放在那里看变量值。
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
using std::cin; using std::cout; using std::endl;
std::vector<int> extractDigits(int n)
{
std::vector<int> digits;
while (n>0)
{
digits.push_back(n%10);
n/=10;
}
return digits;
}
bool IsNumberNarcissistic(int n)
{
auto digits = extractDigits(n);
int sum(0);
int power = digits.size();
for (int digit : digits) sum += std::pow(digit, power);
for (int digit : digits) cout << std::setprecision(10)
<< std::pow(digit, power) << endl;
cout << endl << endl << sum;
return (sum == n);
}
int main()
{
IsNumberNarcissistic(9800817);
}
答案 0 :(得分:0)
评论者已经回答了你的问题,所以我正在标记这个社区Wiki。
我从来没有听说过自恋数字,所以我制作了一个适合你的代码的版本,以便稍微探讨一下这个主题。
std::pow
被我的IPow
取代,这是一个整数取幂函数,它使用标准的二进制数字/平方技术。
#include <iostream>
#include <vector>
std::vector<int> ExtractDigits(int n) {
std::vector<int> digits;
if(n < 0) { n = -n; }
do {
digits.push_back(n % 10);
} while(n /= 10); // 0 has 1 digit
return digits;
}
int IPow(int b, int e) {
if(e < 0) return 0; // truncated fraction
int s = b;
int r = 1;
while(e) {
if(e % 2) { r *= s; }
s *= s;
e /= 2;
}
return r;
}
bool IsNumberNarcissistic(int n) {
const auto digits = ExtractDigits(n);
int sum = 0;
const int power = digits.size();
for (int digit : digits) { sum += IPow(digit, power); }
for (int digit : digits) {
std::cout << digit << "**" << power << " " << IPow(digit, power) << '\n';
}
std::cout << "sum: " << sum << '\n';
return sum == n;
}
int main() {
for(int n : { 9800817, 9800818, 50 }) {
std::cout << n << " is" << (IsNumberNarcissistic(n) ? "" : " not")
<< " Narcissistic\n\n";
}
}
输出
7**7 823543
1**7 1
8**7 2097152
0**7 0
0**7 0
8**7 2097152
9**7 4782969
sum: 9800817
9800817 is Narcissistic
8**7 2097152
1**7 1
8**7 2097152
0**7 0
0**7 0
8**7 2097152
9**7 4782969
sum: 11074426
9800818 is not Narcissistic
0**2 0
5**2 25
sum: 25
50 is not Narcissistic