华师一附中OI组
标题:
1!+2!+***100!
[打印本页]
作者:
diggersun
时间:
2014-11-1 14:54
标题:
1!+2!+***100!
先做简单的,100! 千万注意,中间进位的时候用的是while不是if。思考为什么?
#include <iostream>
using namespace std;
int a[200]; //定义了a[0]***a[9]共10个元素
int i,j,k;
int l;
int x;
int main()
{
a[0]=1;
l=0; //乘法默认的初值是1
for (k=1; k<=100; k++) //做 100次连乘
{
for (i=0; i<=l; i++) a[i]=a[i]*k; //每位数字都乘法
for (i=0; i<=l-1; i++) //进位 标程
{
x=a[i];
a[i]=x%10;
a[i+1]=a[i+1]+x/10;
}
while (a[l]>=10) //因为不止一次进位,所以不用if用while
{
x=a[l];
a[l]=x%10;
a[l+1]=a[l+1]+x/10;
l++;
}
}
for (i=l; i>=0; i--) cout<<a[i];
return 0;
}
复制代码
作者:
diggersun
时间:
2014-11-1 14:59
那么改进的就是这样
#include <iostream>
using namespace std;
int a[200],s[200]; //a表示单个的阶乘,s表示总和。
int i,j,k;
int l;
int x;
int main()
{
a[0]=1;
l=0; //乘法默认的初值是1
for (k=1; k<=10; k++) //做 100次连乘
{
for (i=0; i<=l; i++) a[i]=a[i]*k; //每位数字都乘法
for (i=0; i<=l-1; i++) //进位 标程
{
x=a[i];
a[i]=x%10;
a[i+1]=a[i+1]+x/10;
}
while (a[l]>=10) //因为不止一次进位,所以不用if用while
{
x=a[l];
a[l]=x%10;
a[l+1]=a[l+1]+x/10;
l++;
}
for (i=0;i<=l;i++) s[i]=s[i]+a[i];
for (i=0; i<=l-1; i++) //进位 标程
{
x=s[i];
s[i]=x%10;
s[i+1]=s[i+1]+x/10;
}
while (s[l]>=10) //这里其实可以用if 因为加法只会进最多一次
{
x=s[l];
s[l]=x%10;
s[l+1]=s[l+1]+x/10;
l++;
}
}
for (i=l; i>=0; i--) cout<<s[i];
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2