c语言求阶乘和 求1+2!+3!+...+100!的和,注意溢出

这是我编的,会溢出,不正确,运行结果如下图所示
#include <stdio.h>
void main()
{
int i,j;
double num,sum=0;
for(i=1;i<=100;i++)
{
for(j=1,num=1;j<=i;j++)
num*=j;
sum+=num;
}
printf("sum=%f\n",sum);
}

今天问过老师,貌似需要数组进行定义,求大神回复啊= =

这个用C语言的基本数据类型是做不到的……一种思路是定义一个数组(数据类型是整型),这个数组整体视为一个"n进制"的"大数"(n自定,比如最熟悉的10进制),每个元素是这个数的一个数位(与十进制数进行类比,十进制数12345就相当于一个五个元素的数组,数组的每个元素是这个数的一个数位)。然后对这个数组定义加法与乘法,然后再进行循环求和即可追问

能有完整的程序代码给我看一下么,万分感谢啊

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-04-11
#include <stdio.h>
#define N 10000
int main()
{
static long int r[N]={1};
static long int t[N]={0};
int i,j;
int k=0,l=0,tk=0;
for(i=1;i<=100;i++)
{
for(j=0;j<=l;j++)
{
r[j]=r[j]*i+k;
k=r[j]/10000;
r[j]=r[j]%10000;
t[j]=t[j]+r[j]+tk;
tk=t[j]/10000;
t[j]=t[j]%10000;
}
if(k)
{
l++;
r[j]=k;
t[j]+=r[j];
k=0;
}
if(tk)
{
t[j]+=tk;
if(t[j]>10000)
{
t[j+1]=1;
t[j]=t[j]%10000;
}
tk=0;
}
j=l;

}
printf("1!+2!+3!+....+99!+100!=\n%d",t[j--]);
for(;j>=0;j--)
{
printf("%04d",t[j]);
}
printf("\n");

return 0;
}

1!+2!+3!+....+99!+100!=
94269001683709979260859834124473539872070722613982672442938359305624678223479506023400294093599136466986609124347432647622826870038220556442336528920420940313本回答被提问者和网友采纳
第2个回答  2013-07-03

不需要定义数组,表示成科学计数法就可以了 

如果你不想用科学计数法,你就用循环在后面零就好(用指数E循环)

#include <stdio.h>

int main(int argc, char *argv[])
{
double a=1.0;
int e=0;
for(int i=1;i<=100;i++)
{
a *= i;
while(a>10)
{
a/=10;
e++;
}
}
printf("100!=%lfE%d\n",a,e);
return 0;
}

第3个回答  2013-07-03
#include <stdio.h>
// p = p * n
void mul(int *p, int n)
{
int i, carry = 0;
for(i=1; i<=p[0]; i++)
{
p[i] = p[i]*n+carry;
carry = p[i]/10000;
p[i] = p[i]%10000;
}
if(carry)
p[++p[0]] = carry;
}
// s = s + p
void add(int *s, int *p)
{
int i, carry = 0;
for(i=1; i<=p[0]; i++)
{
s[i] = s[i]+p[i]+carry;
carry = s[i]/10000;
s[i] = s[i]%10000;
}
for(; carry; i++)
{
s[i] += carry;
carry = s[i]/10000;
s[i] = s[i]%10000;
}
s[0] = i-1;
}
// print arr
void prt_arr(int *arr)
{
int i = arr[0];
printf("%d", arr[i--]);
while(i)
printf(",%04d", arr[i--]);
}
//
int main()
{
int i, s[1024] = {1, 0}, p[1024] = {1,1};
for(i=1; i<=100; i++)
{
mul(p, i);
add(s, p);
}
prt_arr(s);
}

第4个回答  2013-07-03

结果需要验证

追问

后缀名cpp。。。。大神,有C语言编写的么

追答

噢,是cpp,vc6的,没有c++的任何语句,C++我还不会呢

相关了解……

你可能感兴趣的内容

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