john123456


私信TA

用户名:john123

访问量:1840

签 名:

等  级
排  名 29030
经  验 525
参赛次数 0
文章发表 3
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:阶乘和累加

没什么好说的

注意事项:是高精度

上代码

#include <cstdio>

int a[10000]; // 记录一个数的阶乘结果

int sum[10000]; // 记录1-n的阶乘的和

// 需要手动实现两种运算:

// 1. 阶乘(大整数、高精度)

// 2. 加法(大整数、高精度)

int jc(int n) { // 1. 阶乘(大整数、高精度)

     int count = 1;

     int add; // 进位

     int cur; // 当前位(current 现在的)

     a[0] = 1;

     for(int i = 1; i <= n; i++) // 每一位乘以i

    { 

         add = 0;

          for(int j = 0; j < count; j++)

         {

              cur = a[j] * i + add; // 相乘 + 进位

              add = cur / 10; // 进位

              a[j] = cur % 10; // 当前

         }

    

        while(add) // 进位累加

        { 

         a[count] = add % 10;

         add = add / 10;

         count++;

        }

    }


    return count; // 返回当前阶乘的数位长度

}

void Add(int len) { // 2. 加法(大整数、高精度)

     int t = 0;

     for(int i = 0; i < len; i++)

     {

         t = t + sum[i] + a[i]; // 把a[i]加到目前的sum[i]上

         sum[i] = t % 10;

         t = t / 10;

     }

    

     if(t != 0) // 需要进位

         sum[len] = t;

     return;

// 没必要对a清零

}

int main() 

{

     int n;

     scanf("%d", &n);

     int len = 0; // 每次循环算出来的阶乘的最大的位数

     for(int i = 1; i <= n; i++) {

         int l = jc(i); // jc返回的是当前阶乘的数位长度

         if(l > len) len = l;

         Add(len);

     }

     for(int i = len - 1; i >= 0; i--)

          printf("%d", sum[i]);

     return 0;

}

注释都包含了,都还好就是Tab太坑了



 

0.0分

1 人评分

  评论区

  • «
  • »