C++数字的总和

C++ sum of numbers

本文关键字:数字 C++      更新时间:2023-10-16

我的程序遇到了一个问题,它应该对从 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*(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 的类型更改为无符号长整型,您的代码将起作用。