通过测试c中的和或积的组合而形成的奇怪输出
我有一个简单的代码问题。我想得到ex4->0+41+32+23+14+0的所有乘积和特定数字的和。为了求和,我做了以下代码:通过测试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
#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;