温涟汐 发表于 2023-7-18 18:44:46

救救孩子吧

##用户输入一个表示范围的最大值 count,程序将测试 3 ~ count 所有的整数是否都符合尼科彻斯定理。

这是那段输出代码
//printf("%lld==%d",sum,a);
for(i=1;k>0;k--,i++)
        {
                printf("%+d",a);
        }
        printf("\n\n");
肯定没问题{:10_254:}(希望是显示错误)

如图所示,等号后面的第一个值有异常。数值小的时候还是很正常的{:10_266:}

大佬们能帮帮我这个小学员吗(╯︵╰)


isdkz 发表于 2023-7-18 18:45:30

问题描述并不够清晰,所以我做了一些假设。我假设你的代码试图检测整数序列是否满足尼科彻斯定理,即对于任意整数m,有m*m*m=m(1)+m(2)+...+m(2m-1),m(1),m(2),...m(2m-1)都是不同的整数。然而,你发现等号右边的第一个值在数值大的时候表现异常。

这可能是由于整数溢出引起的。在C++中,当一个整数超过其类型的最大值时,它将"溢出",结果可能会变得难以预料。这是由于计算机内存中有限的位数用于存储整数值。

在你的代码中, sum和a[]的数据类型是long long和int 。在C++中, long long类型的变量的最大值通常为 9223372036854775807,而int类型的变量的最大值通常为 2147483647。如果你尝试存储更大的值,结果可能会出现问题。

你应该检查sum或a[ i]是否可能在你的计算中溢出。如果是这样,你需要考虑使用更大的数据类型(例如__int128 ),或者更改你的算法以避免大数的出现。

对于尼科彻斯定理的检测,你不一定需要直接计算立方和或序列和,可以利用数学方法进行简化。根据尼科彻斯定理,我们知道m(1)+m(2)+...+m(2m-1)等于m*m*m。同时,由于这是一个等差数列,和也可以通过公式(首项+末项)*项数/2来求得,即m(1)+m(2)+...+m(2m-1)=(m(1)+m(2m-1))*m=m*m*m。这样你只需要验证m(1)+m(2m-1)是否等于m*m,以此检验是否满足尼科彻斯定理,避免了大数的计算。

希望这些信息对你有所帮助,如果问题没有解决,或者我理解你的问题有误,欢迎你提供更多信息。

歌者文明清理员 发表于 2023-7-18 18:47:29

我觉得你电脑中毒了

Threebody1 发表于 2023-7-18 18:47:52

陶远航 发表于 2023-7-18 18:55:43

本帖最后由 陶远航 于 2023-7-18 18:56 编辑

根据你提供的代码,我理解你的需求是根据尼科彻斯定理检查从3到给定范围内的所有整数。尼科彻斯定理指出,对于任何一个 整数n,n^3可以被写成n+(n-1)^2的形式。

根据你提供的输出代码,你遍历了从3到给定范围的所有整数,并将符合尼科彻斯定理的整数打印出来。然而,你提到等号后面的第一个 值有异常。

在你的代码中,如果输入的范围较大,可能会导致计算溢出或超出数据类型的表示范围,从而导致异常的结果。这可能是你遇到问题的原因。

要解决这个问题,你可以尝试使用更大的数据类型,例如`long long int`,以便在更大的范围内进行计算。这样可以避免溢出和数据类 型限制导致的异常。

修改后的代码如下所示:
#include <stdio.h>

int main()
{
int count;
printf("请输入范围最大值: ");
scanf("%d", &count);

for (int i = 3; i <= count; i++) {
    long long int sum = i;
    for (int j = i - 1; j >= 1; j--) {
      sum += j * j;
    }
    printf("%lld ", sum);
}

return 0;
}

通过使用合适的数据类型,你应该能够避免异常的结果。希望对你有所帮助!如果还有其他问题,请随时提问。

温涟汐 发表于 2023-7-18 18:57:49

isdkz 发表于 2023-7-18 18:45
问题描述并不够清晰,所以我做了一些假设。我假设你的代码试图检测整数序列是否满足尼科彻斯定理,即对于任 ...

啊~
数组a 存放的值还不到10000,而且我尝试过把数组的类型改为long long int 但还是数值不对。。。{:10_324:}
初学者好困难{:10_250:}

温涟汐 发表于 2023-7-18 18:58:57

歌者文明清理员 发表于 2023-7-18 18:47
我觉得你电脑中毒了

代码
/*用户输入一个表示范围的最大值 count,
程序将测试 3 ~ count 所有的整数是否都符合尼科彻斯定理。

附加要求:有些用户可能不希望看到打印一丢丢式子,所以是否打印应该让用户确定(提示 -> 用二维数组先保存结果)。
*/
#include<stdio.h>
#include<math.h>

void nike(long long int op)
{
        long long int sum,a;
        int j,i,k;
        for(j=1;;j+=2)
        for(i=j,sum=0,k=0;sum<op;i+=2,k++)
        {
                sum+=i;
                a=i;
                if(sum==op) goto flag;
        }
flag:printf("%lld==%lld",sum,a);
        for(i=1;k>0;k--,i++)
        {
                printf("%+lld",a);
        }
        printf("\n\n");
}

int main()
{
        long long int count;
        int i;
        printf("输入大于二的int:");
        scanf("%d",&count);
        printf("经验证,3~%d的整数均符合定理\n",count);
        for(i=3;i<=count;i++)
        {
                printf("%d^%d==",i,i);
                nike(pow(i,3));
        }
}

要什么图片???

歌者文明清理员 发表于 2023-7-18 19:00:50

温涟汐 发表于 2023-7-18 18:58
代码
/*用户输入一个表示范围的最大值 count,
程序将测试 3 ~ count 所有的整数是否都符合尼科彻斯定 ...

[ i ]和编辑器标签冲突了,代码放在 [ code ] [/ code ] 标签里

sfqxx 发表于 2023-7-18 19:50:45

你的问题描述中提到,你正在尝试验证尼科彻斯定理(Nicomachus's theorem)的有效性,对于给定的范围 `3 ~ count`,你试图证明所有的数都满足该定理。然后你提到,等号后面的第一个值有异常,但具体的异常情况和你的整个代码实现并未给出。

请注意,你给出的代码片段并不完整,因此我无法给出准确的解答。你的代码看起来是在输出一组数组 `a` 的元素,但没有显示生成这个数组的代码,也没有给出 `sum`、`k`、`i` 的定义和初始值。

然而,我可以给你一个基本的C++代码示例,用于验证尼科彻斯定理。请注意,这个代码可能需要根据你的实际情况进行调整。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int count;
    cin >> count; // 用户输入一个表示范围的最大值 count

    for (int n = 3; n <= count; n++) {
      int sum = 0;
      vector<int> nums;
      for (int i = 0; i < n; i++) {
            int num = 2*i + 1; // 生成连续的奇数
            sum += num;
            nums.push_back(num);
      }

      if (sum == n * n * n) {
            cout << n << "^3 = ";
            for (int i = 0; i < nums.size(); i++) {
                cout << nums;
                if (i < nums.size() - 1) {
                  cout << " + ";
                }
            }
            cout << "\n";
      } else {
            cout << "尼科彻斯定理不适用于 " << n << "\n";
      }
    }

    return 0;
}


这个代码会读取用户输入的 `count` 值,并检查从 `3` 到 `count` 的所有整数是否满足尼科彻斯定理。对于每个数 `n`,它会生成前 `n` 个连续的奇数,并将它们加起来。然后,如果这个和等于 `n` 的立方,那么它就会打印出等式;否则,它就会打印出一条消息表示尼科彻斯定理不适用于该数。

请尝试运行这个代码,并根据你的实际需求进行调整。如果你在运行或修改这个代码时遇到问题,或者如果你的问题其实是其他的,请提供更多的信息,我会很乐意帮助你。

陶远航 发表于 2023-7-18 20:30:34

温涟汐 发表于 2023-7-18 18:57
啊~
数组a 存放的值还不到10000,而且我尝试过把数组的类型改为long long int 但还是数值不对。。。{:10 ...

你好,从你的描述中,我看到你在尝试实现尼科彻斯定理。然而,你的代码片段并不完整,这使得问题的确切性质变得不明确。如果你能提供更多的代码,甚至是整个你正在尝试实现的函数,这样我就能更好地理解和帮助解决你的问题。

现在我可以推测的是,你可能在处理大数时遇到了问题。在 C/C++ 中,%lld 是用于打印 long long int 类型的数据,而 %d 用于打印 int 类型的数据。如果 sum 的类型是 long long int,而 a 的类型是 int,且 a 的值超过了 int 可以处理的最大值(2,147,483,647),那么在打印 a 时可能会出现问题。

如果你能提供更多详细的信息,我很乐意帮助你进一步解决这个问题。

两手空空儿 发表于 2023-7-21 11:33:13

本帖最后由 两手空空儿 于 2023-7-21 11:36 编辑

for(j=1;;j+=2)
      for(i=j,sum=0,k=0;sum<op;i+=2,k++)
      {
                sum+=i;
                a=i;
                if(sum==op) goto flag;//sum要<op才会在这个for里,sum==op的时候就跳出for了,所以这一句是永远不会被执行的, 还有就是非必要不要用goto语句,你这段没有这一行它也会去执行后边的输出语句
      }
flag:printf("%lld==%lld",sum,a);
      for(i=1;k>0;k--,i++)
      {
                printf("%+lld",a);
      }
还有一个就是sum的值不是连续的,它可能还没来的及==op,就已经>op了,所以这个判断if(sum==op) 很有问题

温涟汐 发表于 2023-7-21 13:12:53

两手空空儿 发表于 2023-7-21 11:33
还有一个就是sum的值不是连续的,它可能还没来的及==op,就已经>op了,所以这个判断if(sum==op) 很有问题

谢谢,这问题我没注意过{:10_288:}

Sorawithcat 发表于 2023-7-31 17:59:46

没看懂题目{:10_266:}
页: [1]
查看完整版本: 救救孩子吧