急!!!C语言阶乘问题 求一到一百的阶乘和 用While或While do循环语句或for 语句

如题所述

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN=510;

char re[MAXN];
struct Big{
int s[MAXN],len;
Big():len(1){memset(s,0,sizeof(s));}
void read()
{
scanf("%s",re);
int n=strlen(re);
len=(n-1)/4+1;int x=len,k=0;
while('0'<=re[k]&&re[k]<='9')
{
if(k&&k%4==n%4)x--;
s[x]=s[x]*10+re[k]-'0';
++k;
}
}
void print()
{
for(int i=len;i>=1;--i)
{
if(i!=len)printf("%04d",s[i]);
else printf("%d",s[i]);
}
}
Big& operator +=(Big &a)
{
int n=max(a.len,len);
for(int i=1;i<=n;++i)
s[i]+=a.s[i],s[i+1]+=s[i]/10000,s[i]%=10000;
while(s[len+1])len++;
return *this;
}
Big& operator *=(Big &a)
{
for(int i=len;i;--i)
{
for(int j=a.len;j-1;--j)
s[i+j-1]+=s[i]*a.s[j];
s[i]=s[i]*a.s[1];
int k=i;
while(s[k])
s[k+1]+=s[k]/10000,s[k]%=10000,++k;
}
while(s[len+1])len++;
return *this;
}
};
bool operator <(Big &a,Big &b)
{
if(a.len!=b.len)return a.len<b.len;
for(int i=a.len;i>=1;--i)
if(a.s[i]!=b.s[i])return a.s[i]<b.s[i];
return false;
}
Big operator * (Big &a,Big &b)
{
Big c=a;
return c*=b;
}
Big operator + (Big &a,Big &b)
{
Big c=a;
return c+=b;
}
int main()
{
Big sum,x,i,dz,lim;
dz.s[1]=i.s[1]=x.s[1]=1;
lim.s[1]=101;
for(;i<lim;i+=dz)
sum+=x*=i;//从右往左运算,相当于x=x*i;sum=sum+x;
sum.print();
}

楼上用int的,自然溢出运行出来应该会是负数或者0.....题主以后如果出阶乘题数据要小

运行结果:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-04
循环嵌套,一个相加,一个相乘,数字绝对会超过long long的。用字符串或者数组存。追问

看不懂😂

还能详细点吗

追答

for(a=1;a<=100;a++)
for(b=1;b<=a;b++)
用int是肯定会溢出的。
用数组来存数比如一个数字是123,那么a[0]=1,a[1]=2,a[2]=3.你自己想下吧

第2个回答  推荐于2017-09-20
int i,x=1;
for(i=2;i<=100;i++)
    x*=i;


int i=2,x=1;
while(i<=100){
    x*=i;
    i++;
}


int i=2,x=1;
do{
    x*=i;
    i++
}
while(i<=100)

追问

那个*是什么

追答

*=
是c里面的一种算符,就是“乘的是”
x*=2;意思是x=x*2,“x乘的是2”
注意下逗号,第三段i++没写

追问

这只有100的阶乘啊 我是说一到一百的阶乘的和

追答int i, j;
double x, sum=0;
for(j=1;j<=100;j++){
    for(i=2,x=1;i<=j;i++)
        x*=i;
    sum+=x;
}

int i, j;
double x, sum=0;
while(j<=100){
    x=1;
    i=1;
    while(i<=j){
        x*=i;
        i++;
    }
    sum+=x;
    j++
}

int i,j;
double x, sum=0;
do{
    i=1;
    x=1
    do{
        x*=i;
        i++
    }
    while(i<=j)
    sum+=x;
    j++
}
while(i<=100)

当然,我承认int存储不了这么大的数,完整的结果要用下面的高精度算法,这种算法仅供理解性参考

追问

Int存不了 那应该用什么呀

追答

可以用double,像我写的那样,但是不精确。如果要知道每一位的话,要用“高精度算法”(详见百度),就是把数分解成很长的数组,每个单元存一位数,然后让计算机像做小学竖式乘法那样计算,最后把这个长数组打印出来,实现方法可以用楼下那个C++,C的实现可以百度一下。

本回答被提问者和网友采纳