江苏皇室食品厂怎么样:C语言:求1!-2!+3!-4! +……+49! -50!的和。

来源:百度文库 编辑:高考问答 时间:2024/05/05 00:44:53
求1!-2!+3!-4! +……+49! -50!的和!
高手帮忙!要可行的!
急啊,最好是完整的,复制到TURBOC中就能运行的

上面的程序有几个问题
一是越界,50!早就超过int的表示范围
二是效率低,四个for循环
三是结果不正确,每个for(k=1;k<=i;k++)前都没有把设tem = 1

#include <stdio.h>

int main()
{
double sum = 0;
double tmp = 1;
int mul = 1;
int i;
for(i=1;i<=50;i++)
{
tmp *= i;
sum += tmp*mul;
mul *= -1;
}
printf("1!-2!+3!-4!+.....+49!-50! = %e",sum);
}

50!是一个多达64位十进制整数,
无论是int或_int64的数据类型都装不下50!
下面的程序使用一个int[50]的数组存储运算结果,
其中每个元素存储4位十进制数。

通过修改N为其它值可以求其它的表达式的值。

祝你好运!

==========================================================

/**求1!-2!+3!-...+(+|-)N!,结果存储在整数数组中,其中数组第一个元素存储数组的长度*/
#define N 50
#define BASE 10000
void fac()
{
int tmp[N],plus[N],minus[N],*p,*q;
int i,j,k;
//初始化数组
for(i=0;i<N;i++)
{
tmp[i]=0;
plus[i]=0;
minus[i]=0;
}

tmp[N-1]=1;
plus[N-1]=1;

for(i=2;i<=N;i++)
{
//求i!
for(j=0;j<N;j++)
{
tmp[j]*=i;

k=j;
while(tmp[k]>=BASE)
{
tmp[k-1]+=tmp[k]/BASE;
tmp[k]%=BASE;
k--;
}

}

//求1!+3!+...或2!+4!+...
p=(i&1)?plus:minus;
for(j=0;j<N;j++)
{
p[j]+=tmp[j];

k=j;
while(p[k]>=BASE)
{
p[k-1]+=p[k]/BASE;
p[k]%=BASE;
k--;
}
}
}

if(N&1)//N是奇数,结果应为正
{
p=plus;
q=minus;
}
else//N是偶数,结果应为负
{
p=minus;
q=plus;
}

//求差,p中的值比q中的值大
for(i=0;i<N;i++)
{
p[i]-=q[i];
j=i;
while(p[j]<0)
{
p[j--]+=BASE;
p[j]--;
}
}

//输出结果
for(i=1;i<=N;i++)
{
if(i==1)
{
printf("%d!",i);
}
else if(i&1)
{
printf("+%d!",i);
}
else
{
printf("-%d!",i);
}
}
printf(" = ");

if((N&1)==0)//N是偶数,结果应为负
{
printf("-");
}

for(i=0;i<N;i++)
{
if(p[i])break;
}

printf("%d",p[i++]);

for(;i<N;i++)
{
j=BASE/10;
while(j)
{
printf("%d",(p[i]/j)%10);
j/=10;
}
}
printf("\n\n");
}

main(){
double a=1,i,m=0;
for(i=1;i<=50;i++)
{a*=i;
m+=a;
}
printf("1!-2!+3!-4!+.....+49!-50!=%g",m);
getch();
}

main()
{
int i,j,k,sum;
int a=1;
int b=1;
int tem=1;

for(i=1;i<=49;i+=2)
{
for(k=1;k<=i;k++)
{tem=tem*k;}
a=a+tem;
}
for(j=2;j<=50;j+=2)
{
for(k=1;k<=j;k++)
{tem=tem*k;}
b=b+tem;
}
sum=a-b;
}