华师一附中OI组

标题: 1!+2!+***100! [打印本页]

作者: diggersun    时间: 2014-11-1 14:54
标题: 1!+2!+***100!
先做简单的,100! 千万注意,中间进位的时候用的是while不是if。思考为什么?
  1. #include <iostream>
  2. using namespace std;
  3. int a[200]; //定义了a[0]***a[9]共10个元素
  4. int i,j,k;
  5. int l;
  6. int x;
  7. int main()
  8. {
  9.     a[0]=1;
  10.     l=0;  //乘法默认的初值是1
  11.     for (k=1; k<=100; k++)  //做 100次连乘
  12.     {
  13.         for (i=0; i<=l; i++) a[i]=a[i]*k;  //每位数字都乘法
  14.         for (i=0; i<=l-1; i++)  //进位  标程
  15.         {
  16.             x=a[i];
  17.             a[i]=x%10;
  18.             a[i+1]=a[i+1]+x/10;
  19.         }
  20.         while (a[l]>=10)    //因为不止一次进位,所以不用if用while
  21.         {
  22.             x=a[l];
  23.             a[l]=x%10;
  24.             a[l+1]=a[l+1]+x/10;
  25.             l++;
  26.         }
  27.     }
  28.     for (i=l; i>=0; i--) cout<<a[i];
  29.     return 0;
  30. }
复制代码

作者: diggersun    时间: 2014-11-1 14:59
那么改进的就是这样
  1. #include <iostream>
  2. using namespace std;
  3. int a[200],s[200]; //a表示单个的阶乘,s表示总和。
  4. int i,j,k;
  5. int l;
  6. int x;
  7. int main()
  8. {
  9.     a[0]=1;
  10.     l=0;  //乘法默认的初值是1
  11.     for (k=1; k<=10; k++)  //做 100次连乘
  12.     {
  13.         for (i=0; i<=l; i++) a[i]=a[i]*k;  //每位数字都乘法
  14.         for (i=0; i<=l-1; i++)  //进位  标程
  15.         {
  16.             x=a[i];
  17.             a[i]=x%10;
  18.             a[i+1]=a[i+1]+x/10;
  19.         }
  20.         while (a[l]>=10)    //因为不止一次进位,所以不用if用while
  21.         {
  22.             x=a[l];
  23.             a[l]=x%10;
  24.             a[l+1]=a[l+1]+x/10;
  25.             l++;
  26.         }
  27.         for (i=0;i<=l;i++) s[i]=s[i]+a[i];
  28.         for (i=0; i<=l-1; i++)  //进位  标程
  29.         {
  30.             x=s[i];
  31.             s[i]=x%10;
  32.             s[i+1]=s[i+1]+x/10;
  33.         }
  34.         while (s[l]>=10)    //这里其实可以用if 因为加法只会进最多一次
  35.         {
  36.             x=s[l];
  37.             s[l]=x%10;
  38.             s[l+1]=s[l+1]+x/10;
  39.             l++;
  40.         }

  41.     }

  42.     for (i=l; i>=0; i--) cout<<s[i];
  43.     return 0;
  44. }
复制代码





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2