C语言中的子集和程序

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)

我开始用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)
        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)