我正在编写c中子集和问题的程序。当数组中的元素数量<= 30时,如果数组中元素的数量是&gt;则程序运行正常。 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)
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");
}
答案 0 :(得分:4)
当int
类型溢出时,您会得到除零。 (power(2, 32)
可能被评估为0但你应该将其视为共同点,因为签名溢出是未定义的行为在C)。
在C中,您可以使用uint64_t
,它是64位无符号整数类型。自从(包括)C99以来一直存在。请注意,unsigned
溢出在C中定义为降低模2的次幂
这会在power(2, 63)
之前为您提供良好的结果。
答案 1 :(得分:1)
使用32位有符号整数,您只能表示最多2^31 - 1
的值,因此n
必须为<= 30
。对于较大的n
值,使用64位整数(最好是无符号),例如
int n = 60;
uint64_t s = 1ULL << n; // s = pow(2, n) = pow(2, 60)
答案 2 :(得分:0)
s
是一个signed int
,当n大于31时,您会感到非常不满...... {/ 1>。