1!+3!+5!+...+100!怎么做??用c语言编程

就算1!+3!+5!+。。。+95!+97!+99!吧,麻烦了

第1个回答  2009-12-01
1,3,5,7…100?这个是怎么过渡到100的?能麻烦写出100之前的两项么

随便写了个, 不能用来计算太大的数. 不过算个99还是没问题.
虽然还有很多优化的余地, 不过算法层面已经优化过了, 所以运算速度还行

结果显示为:
933358357530259404899649452203330841414181273099622712464375347290843915456047571923795747224123220549817374436563436798611989742138867497898583379392681647

#define CHECK 2
#define MAX 100000000
#define K 10000
typedef unsigned short U16;
typedef unsigned long U32;
typedef struct Huge
{
U32 *data;
U32 len;
U32 used;
} Huge;

void Show ( Huge *x )
{
U32 i;

i = x->used - 1;
printf ( "%u", x->data[i--] );
for ( ; i != 0xFFFFFFFF; i-- )
{
printf ( "%08u", x->data[i] );
}
printf ( "\n" );
}

void IncLen ( Huge *x )
{
U32 *tmp;
U32 len;

if ( x->len - x->used > CHECK )
return;

len = x->len * sizeof(U32);
tmp = (U32*)malloc ( len << 1 );
if ( tmp == 0 )
exit(0);
memcpy ( tmp, x->data, len );
memset ( tmp + x->len, 0, len );
x->len <<= 1;
free ( x->data );
x->data = tmp;
return;
}

U16 hi ( U32 x )
{
return (U16)( x / K );
}

U16 lo ( U32 x )
{
return (U16)( x % K );
}

void Mac ( Huge *x, U32 mpy, U32 add )
{
U32 i;
U32 clo, chi, mid;
U16 alo, ahi;
U16 blo, bhi;
if ( mpy > MAX || add > MAX )
exit(0);
for ( i = 0; i < x->used; i++ )
{
bhi = hi ( mpy );
blo = lo ( mpy );
ahi = hi ( x->data[i] );
alo = lo ( x->data[i] );

clo = alo * blo + add;
mid = alo * bhi + ahi * blo;
chi = ahi * bhi;

clo += lo ( mid ) * K;
chi += hi ( mid );

for ( mid = 0; clo > MAX; mid++ )
clo -= MAX;
chi += mid;

x->data[i] = clo;
add = chi;
}

if ( add != 0 )
{
x->data[i] = add;
x->used ++;
}
}

void InitHuge ( Huge *x, U32 len, U32 value )
{
x->data = (U32)malloc ( sizeof(U32) * len );
x->len = len;
x->used = 1;
*(x->data) = value;
}

int main()
{
const U32 n = 99;
U32 i;
Huge x;

InitHuge ( &x, 16, 1 );
for ( i = n; i > 1; i -= 2 )
{
Mac ( &x, ( i - 1 ) * i, 1 );
IncLen ( &x );
}
Show ( &x );
return 0;
}
第2个回答  2009-12-01
有点麻烦,100!是很大的数,这个程序要用大整数加、乘算法。
思路的话就是1楼的了。只是计算阶乘里面的乘要用大整数乘。
而累加要用大整数加法。我现在没时间给你写带大整数的阶乘累加程序,只能把以前回答过的程序给你提供个思路。

这个程序不能算到100!那么大,顶多到30+!就不行了。

#include<stdio.h>
unsigned long FactorialSum(int max)
{
int i;
unsigned long sum = 0;
for(i = 1;i<=max;i++)
sum+=(unsigned long)Factorial(i);
return sum;
}
unsigned long Factorial(int n)
{
if(n<=0)
return 0;
else if(n == 1)
return 1;
else
return n*Factorial(n-1);
}
int main()
{
printf("%lu",FactorialSum(33));
}本回答被网友采纳
第3个回答  2009-12-01
unsigned double jiecheng(unsigned double number)
{
if(number=1) return 1;
else return number*jiecheng(number-1);
}
unsigned long x=100;
unsigned long i=1;
unsigned double he=0;
for(i<x;i+=2)
{
he+=jiecheng(i);
}
he+=jiecheng(100);
he的值就是总值。但是取值范围可能是有问题的。100!是没有办法用数值类型表示的。

你可以用字符串表示。算法太麻烦。
第4个回答  2009-12-01
#include<stdio.h>
int main ()
{
int i=1,jie=1;
double sum=1;
while(i<=100)
{
double jie=i;
while(jie-1)
{
jie*=(jie-1);
jie--;
}
sum=sum+jie;
i+=2;
}
printf("和为:%d\t",sum);
getchar();
return 0;
}
}
可能100的阶太大了吧,显示不出来
第5个回答  2009-12-01
写个计算阶乘的函数,之后写个循环就是了

相关了解……

你可能感兴趣的内容

大家正在搜

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网