代码::块13.12c和#x2B+;给出错误答案的整数之和 刚才我写了一个C++的简单函数,确定一个数字是否自恋,我偶然发现了一些最奇怪的东西。对于9800817和9926315这两个自恋的数字,我在函数“IsNumberArcAssistic”中得到了错误的和。我得到的和总是比它应该的少1,分别是9800816和9926314。但是,将变量sum声明为double可以解决问题
所以我的问题是,这里发生了什么?是代码:与块相关的问题,还是其他问题?我正在使用代码:Blocks 13.12。先谢谢你 别介意我在函数中做的那些打印,我只是把它们放在那里看变量值代码::块13.12c和#x2B+;给出错误答案的整数之和 刚才我写了一个C++的简单函数,确定一个数字是否自恋,我偶然发现了一些最奇怪的东西。对于9800817和9926315这两个自恋的数字,我在函数“IsNumberArcAssistic”中得到了错误的和。我得到的和总是比它应该的少1,分别是9800816和9926314。但是,将变量sum声明为double可以解决问题,c++,c++11,C++,C++11,所以我的问题是,这里发生了什么?是代码:与块相关的问题,还是其他问题?我正在使用代码:Blocks 13.12。先谢谢你 别介意我在函数中做的那些打印,我只是把它们放在那里看变量值 #include <iostream> #include <vector> #include <cmath> #include <iomanip> using std::cin; using std::cout; using s
#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);
}
#包括
#包括
#包括
#包括
使用std::cin;使用std::cout;使用std::endl;
标准::向量抽取数字(整数n)
{
向量数字;
而(n>0)
{
数字。推回(n%10);
n/=10;
}
返回数字;
}
bool是数字辅助(int n)
{
自动位数=提取位数(n);
整数和(0);
整数幂=digits.size();
对于(整数位数:位数)和+=标准::功率(位数,功率);
对于(int-digit:digits)cout评论者已经回答了您的问题,所以我正在标记这个社区Wiki
我从来没有听说过自恋数字,所以我制作了一个版本的代码,它可以正常工作,以便稍微探索一下这个主题
std::pow
被myIPow
取代,这是一种使用标准二进制数字/平方技术的整数幂函数
#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";
}
}
“是代码:与块相关的问题,还是其他问题?”我想说的另一个问题。IDE很少是罪魁祸首。更多的是与使用的目标平台和工具链相关。请记住,这是一个浮点函数,因此可能会导致舍入问题。最有可能的问题来自sum+=std::pow(数字,电源)
。听起来你可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,你可以逐行执行你的程序,看看它偏离了你的预期。如果你要做任何编程,这是一个必不可少的工具。进一步阅读:没有问题,但不要使用std::endl
除非你需要额外的东西。“\n”
结束一行。@PaulMcKenzie,谢谢。我没有正确阅读函数pow的文档,这是我最大的错误。