C++数字的总和
C++ sum of numbers
我的程序遇到了一个问题,它应该对从 1 到 70000 (1+2+3+4+...+69999+70000) 的数字求和。我的程序可以毫无问题地对数字求和到 65535,但对于高于 65535 的任何求和,结果显示负数,这是错误的。谁能向我解释为什么我的程序不能对 65535 以上的数字求和?
这是我的代码:
#include <stdio.h>
void sum(int *s)
{
*s=0;
int i=1;
int n=70000;
while(i<=n)
{
*s+=i;
i++;
}
}
main()
{
int s;
sum(&s);
printf("Suma prirodnih brojeva od 1 do 70000 je: %dn",s);
}
你的 int 溢出了它的功能。
尝试很长时间。 最好是无符号的,因为您不需要负数。
您应该修复帖子中的格式。
我想到的第一个解决方案可能是,在您的实现中,整数的大小等于 16 位(2 字节),而不是通常的 32 位(4 字节)。您应该改用 long,这保证了标准的 32 位内存。
我也不知道为什么你决定使用引用,而你可以简单地从 sum 函数返回值,如下所示:
long sum(long s)
{
//while code
return value;
}
我希望它有所帮助。
每个整数可以保存预定义的值范围。在 C 中,您可以使用特殊的宏查看此范围。例如,对于 int 类型,您可以通过以下方式获取可存储在此类型的对象中的最大值和最小值。
#include <limits.h>
#included <stdio.h>
int main()
{
printf( "The maximum value of type int is %d and the minimum value is %dn", INT_MAX, INT_MIN );
}
如果某个值不能放入给定类型的对象中,则应选择具有更高等级的整型。例如,无符号 int 的范围通常大于有符号 int 的范围。您应该通过运行我显示的程序来选择合适的类型。但不要忘记在 printf 语句中使用正确的格式说明符。您可以检查无符号的整数、长整型、无符号长、长长和无符号长长。
这是因为整数可以保持原始限制为 -32767 到 32767。您可以使用 long 作为数据类型
您可以在下面参考数据类型的功能(即使它取决于编译器)
- 做空 int 和 int: -32,767 到 32,767 无
- 符号短 int 和无符号 int:0 到 65,535 多头内线:-2,147,483,647至
- 2,147,483,647
- 无符号多头整数:0 到 4,294,967,295
你遇到的内容在计算机体系结构中都有介绍。
基本 int 设计为 16 位,范围高达 65535。这意味着此时所有给定位均为 1,即 1111 1111 1111 1111。向此位模式添加 1 是不可能的,因为它最多只支持 16 位,因此添加 1(或更多)会产生不希望的行为:查找溢出。
因此,您需要使用具有更多位模式的实现:long int
是您应该使用的东西。它使用 32 位来表示数据。为您提供更大的范围。如果我没记错的话,超过40亿。
接下来,您不应该手动将 1 添加到 7000(如上面的注释中所述)。 1 到 n 的总和 = n(n+1)/2
因此你的代码:当n = 7000
long sum (){
return ((7000(7000 + 1))/2)
}
实际上,当您将数字存储在内存中时,它会被映射到其等效的二进制代码中例如,4 在内存中存储为 100。在内存中存储 3 需要 4 位,因为它的二进制需要 3 位。大约需要log(n)(以2为基数)位才能将n存储在内存中。因此,如果 n 非常大,log(n) 也很大,并且会发生溢出。Int 长度为 4 个字节,表示 32 位。您应该尝试使用长 int(8 字节)来处理您的总和。如果数字变得更大,你可以使用long long int,对于甚至长long int无法处理的数字,可以在C++中由GNU多精度库处理。这是对这个库的引用https://gmplib.org
您可以使用以下事实对其进行优化:
1 + 2 + 3 + ... + (n - 1) + n = (1 + n) + (2 + (n - 1)) + (3 + (n - 2)) + ... + ((n / 2) + (n / 2) + 1) = (n + 1) * (n / 2) = (n + 1) * n / 2
个数字之和的公式为 N*(N-1)/2。
在您的情况下,这将是 70000*69999/2 = 2449965000(大约 25 亿)
要将其存储在变量中,您需要一个能够存储足够多位来表示 25 亿的变量。
8 位 = 0 至 25616 位 = 0 至 6553532 位 = 0 到 4294967295(足够大)
您需要一个 32 位变量。您也可以将其用作备忘单:http://www.cplusplus.com/reference/climits/
所需的类型是无符号长整型。
将 i 和 n 的类型更改为无符号长整型,您的代码将起作用。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 将数字打印成文字
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 在将数字随机生成为数组期间从内存输出随机数的数组