C语言中的子集和程序
我开始用c语言编写子集和问题的程序。当数组中的元素数为30时,程序运行正常,程序无法正常工作,并给执行一个类型为“System.DivideByZeroException”的未处理异常 源代码:C语言中的子集和程序,c,C,我开始用c语言编写子集和问题的程序。当数组中的元素数为30时,程序运行正常,程序无法正常工作,并给执行一个类型为“System.DivideByZeroException”的未处理异常 源代码: #include<stdio.h> #include<math.h> int power(int a,int b) { int i=2; int base=2; if(b==0) return 1; if(b==1)
#include<stdio.h>
#include<math.h>
int power(int a,int b)
{
int i=2;
int base=2;
if(b==0)
return 1;
if(b==1)
return a;
else
while(i<=b)
{
a=a*base;
i++;
}
return a;
}
int main()
{
int n,p,q,s,sum;
n=30; // no. of element in the array.
p=0;
q=0;
sum=0;
int aa[30]={3,2,5,1,9,4,5,1,33,23,87,132,74,63,19,2,32,75,17,32,93,34,4,54,12,95,34,82,75,83};
s=power(2,n); // no. of subsets in the set
while(p<=s)
{
while(q<n)
{
if(power(2,q)<=(p%power(2,q+1)) && (p%power(2,q+1))<=(power(2,q+1)-1) )
sum=sum+aa[(n-1)-q];
q++;
}
if(sum==16)
{
printf("Found the SUM at row %d",p);
}
sum=0;
p++;
q=0;
}
printf("Not Found");
}
对于32位有符号整数,您只能表示最大为2^31-1的值,因此n必须对于32位有符号整数,您只能表示最大为2^31-1的值,因此n必须s是有符号整数,并且您非常不安地接近于用s=幂2溢出它,当n大于31时为n。s是有符号整数,当n大于31时,s=幂2时,n接近溢出,这令人不安。s是有符号整数,当int类型溢出时,n会被零除。power2,32可能被评估为0,但您应该将其视为一个共有项,因为有符号溢出在C中是未定义的行为 在C语言中,可以使用uint64\t,它是一种64位无符号整数类型。从C99开始就有了。注意,无符号溢出在C中定义为减少2的模幂
这将为您提供高达power2,63的良好结果。当您的int类型溢出时,您将得到一个除零的结果。power2,32可能被评估为0,但您应该将其视为一个共有项,因为有符号溢出在C中是未定义的行为 在C语言中,可以使用uint64\t,它是一种64位无符号整数类型。从C99开始就有了。注意,无符号溢出在C中定义为减少2的模幂
这将为您提供高达power2、63的良好结果。这是C代码,但您得到的是C异常吗?好把戏。还有,为什么要编写一个通用的power方法来完成1我使用的是visualc++所以这是c代码,但是你得到了一个c异常?好把戏。还有,为什么要写一个通用的power方法呢?我正在使用visualc++@DarkDust:喝咖啡。你当然是对的。我们将联合出版。@DarkDust:喝咖啡。你当然是对的。我们将联合出版。
int n = 60;
uint64_t s = 1ULL << n; // s = pow(2, n) = pow(2, 60)