通过测试c中的和或积的组合而形成的奇怪输出

通过测试c中的和或积的组合而形成的奇怪输出,c,C,我有一个简单的代码问题。我想得到ex4->0+41+32+23+14+0的所有乘积和特定数字的和。为了求和,我做了以下代码: #include <stdio.h> #include <stdlib.h> typedef struct{ unsigned int x; unsigned int y; }str; const int MAX = 200000; int main(int argc,char *argv[]){ int s=atoi(ar

我有一个简单的代码问题。我想得到ex4->0+41+32+23+14+0的所有乘积和特定数字的和。为了求和,我做了以下代码:

 #include <stdio.h>
 #include <stdlib.h>

 typedef struct{
 unsigned int x;
 unsigned int y;
 }str;

 const int MAX = 200000;

 int main(int argc,char *argv[]){
 int s=atoi(argv[1]);
 if(s<0 || s>MAX){
    printf("errore nummero incompatibile!\n");
    exit(-1);       
 }
 str sum;
 int n=MAX;
 for (sum.x=0;sum.x<n;sum.x++){
    for (sum.y=0;sum.y<n;sum.y++){
        if(strcmp(argv[2],"+")==0){
            if(sum.x+sum.y==s){
                printf("%d + %d = %d\n",sum.x,sum.y,s);
            }
        }else{
            if(sum.x*sum.y==s){
                printf("%d * %d = %d\n",sum.x,sum.y,s);
            }
        }
    }
 }
 exit(-1);
 }
它给出了正确的输出,但随后开始给出更多的数字。每次我运行它时,这些都是相同的。这是什么?我如何才能阻止它?

这是由以下原因造成的:

4294967340太大,无法表示为平台上32位的无符号整数。因此,不适合的最高有效位将被丢弃,从而有效地得到模2到32的幂的结果:

4294967340 mod 2**32 == 44

通过检查
sum.x>UINT\u MAX-sum.y
并离开内部循环或执行其他操作,可以检测
sum.x+sum.y
中的溢出。对于乘法也可以进行类似的检查。

您对每个数字进行迭代,直到
MAX
,从而导致沿途溢出()。那没必要。当你试图找到2个整数的每一个乘法组合时,你只需要迭代到所说的数字,如果这个数字太大,则迭代到MAX。 尝试改变

  int n=MAX;
作者:


出于某种原因,它不再显示1*44和44*1,但至少溢出的是gone@CoderGuy这很正常。更改
(sum.x=0;sum.x在实际尝试访问这些参数之前,应检查argc中的值,以确保所需的2个参数存在。如果它们不存在,则代码应显示“用法”消息并带错误退出(-1)这两个“for”语句受MAX而不是“s”的限制。缺少“#include”头文件,因此调用strcmp()未传递正确的参数。该结构具有“unsigned”字段,但工作值为“int”,因此编译器会对有符号整数和无符号整数之间的比较发出多个警告。建议;启用所有警告,重新编译代码,修复警告,并重新发布代码根据上述注释修改代码后,它将继续运行ks对于“”和“+”都是正确的。但是,上限最大值有一个严重的限制(只有在使用“”时才能看到)@user3629249现在一切对我来说都正常了……基本问题是使用max而不是s来设置n,这个答案没有解决这个问题。这个问题是关于由整数溢出引起的奇怪输出。
4294967340 mod 2**32 == 44
  int n=MAX;
 int n = s;
 if (s > MAX)
    int n=MAX;