C语言 100-200间所有偶数之积与奇数之积

输出100-200间所有偶数之积和奇数之积
为什么我用while语句或者for语句整合到一起算的时候输出的奇数之积为负值?

 #include <stdio.h> 
#include <math.h>  
 main()  
{  
    int n=102;  
    long double odd1=100,odd2;

    while (n<=200)  
    {  
        if(n%2==0)  
        { 
            odd1*=n;
            n++;   
        }   

         else  
          {odd2=101;
            odd2*=n;
            n++;    
          }   
    }  
    printf("odd1=%d\nodd2=%d",odd1,odd2);   
} 

如果分开算的话就不会有这个问题。

 #include <stdio.h> 
 main() 
{ 
int i; 
long double k=100; 
for(i=102;i<=200;i+=2) 
   { 
     k=k*i;
   }
printf("100-200间偶数之积为%d\n",k);
long double t=101;
for(i=103;i<=199;i+=2)
   {
     t=t*i;
   } 
printf("100-200间奇数之积为%d\n",t);
}

long double odd1=100,odd2;
改成: unsigned long double odd1=100,odd2; 在试试,有符号型的变量第一位为1的时候表示负数。

else

{odd2=101;
odd2*=n;
n++;

} 不太明白你为什么要在循环里赋odd2=101。

//这里。
   while (n<=200)  
    {  
        if(n%2==0)  
        { 
            odd1*=n;
            n++;   
        }   

         else  
          {odd2=101;//实在不理解这句放循环里的意义,拿到循环外。
            odd2*=n;
            n++;    
          }   
    }  

还有试下将long double odd1 = 102;
long double odd2 = 101;
这两句分开定义和赋值初始化。
long double 没初始化的话,好像会直接用地址去计算。
还有出现负数也可能跟你使用的编译环境有关。

    UINT64 nOdd = 1,nEven = 1;
    for (int i = 101; i < 120; i ++)
    {
        if (i % 2 == 0)
        {
            nEven *= i;
        }
        else
        {
            nOdd *= i;
        }
    }

这么大的乘积,早已经超越了。。。

100~200之间偶数积:345484498181231072179033122945948033435772722271721910560634053031696805747770716144002015218892800000000000000
100~200之间奇数积:2445999815161523630887704671984588444168204294063971389328824409282436267548292961169809313166875301513671875