解题思路:阶乘和累加

没什么好说的

注意事项:是高精度

上代码

#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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论