This question already has answers here:
Multiplication of two integers in C++
(3个答案)
4年前关闭。
在检测范围内的Kaprekar数时,在C++中发现了此问题。对于号码77778-
返回6,049,417,284而
返回1,754,449,988
有什么想法吗?这是pow可以避免的溢出,但是正常的n * n不会。
相当于
因为n * n将在将结果分配给sq之前首先进行处理(均为整数),所以这是溢出问题(并且也欢迎堆栈溢出!)。
您可能还希望通过四处搜索来更多地理解这些术语
这与Kaprekar数无关。在当今的大多数机器中,
因此,处理n * n将为您提供:
如果您事先进行铸造:
然后结果将是相同的,因为不会出现溢出。
(3个答案)
4年前关闭。
在检测范围内的Kaprekar数时,在C++中发现了此问题。对于号码77778-
unsigned long long sq = pow(n, 2);
返回6,049,417,284而
unsigned long long sq = n * n;
返回1,754,449,988
有什么想法吗?这是pow可以避免的溢出,但是正常的n * n不会。
最佳答案
假设您的n
是典型的int
或unsigned int
,这是因为
这条线
unsigned long long sq = n * n;
相当于
unsigned long long sq = (int)(n * n);
因为n * n将在将结果分配给sq之前首先进行处理(均为整数),所以这是溢出问题(并且也欢迎堆栈溢出!)。
您可能还希望通过四处搜索来更多地理解这些术语
overflow
和casting
(由于它们是计算机中非常常见的问题,因此尽早理解它们会很有帮助!)。这与Kaprekar数无关。在当今的大多数机器中,
int
是32位的。因此,它只能处理值-2,147,483,648到2,147,483,647(对于无符号整数计数器部分,则只能处理0到4,294,967,295)。因此,处理n * n将为您提供:
n * n = 6,049,417,284 - 4,294,967,296 = 1,754,449,988 //overflow at (4,294,967,295 + 1)!
如果您事先进行铸造:
unsigned int n = 77778;
unsigned long long sq = pow(n, 2);
unsigned long long sq2 = (unsigned long long)n * n; //note the casting here.
std::cout << sq << std::endl;
std::cout << sq2 << std::endl;
然后结果将是相同的,因为不会出现溢出。
关于c++ - C++中的平方数,Kaprekar数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34447435/
10-12 12:20