C中的子集总和程序

时间:2014-11-06 16:25:19

标签: c

我正在编写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");

} 

enter image description here

3 个答案:

答案 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>。