zoukankan      html  css  js  c++  java
  • [蓝桥杯][基础练习VIP]阶乘计算

    [蓝桥杯][基础练习VIP]阶乘计算 https://www.dotcpp.com/oj/problem1474.html

     1 #include<iostream>
     2 using namespace std;
     3 void multiply(int x[], int t)
     4 {
     5     for (int i = 0; i < x[4999]; i++)
     6         x[i] *= t;
     7     for (int i = 0; i < x[4999]; i++)
     8     {
     9         int n = x[4999];
    10         int s = x[i], k = 1;
    11         x[i] = s % 10;
    12         while (s /= 10)
    13         {
    14             x[i + k++] += s % 10;
    15             if (i == n - 1) x[4999]++;
    16         }
    17     }
    18 }
    19 int main()
    20 {
    21     int x[10005] = { 1,0 };
    22     x[4999] = 1;   //存放数字长度
    23     int num, i = 2, n = 0;
    24     cin >> num;
    25     while (i <= num) multiply(x, i++);
    26     for (int k = x[4999] - 1; k >= 0; k--) cout << x[k];
    27     return 0;
    28 }

    思路:

    multiply函数:让一个整数按位数保存在一维数组中,让一个数组中每一位与一个数相乘,数组中每个位置存放每一位相乘后的结果

    然后再对每个位置依次进位,相当于手写的乘法(每一位与被乘数相乘,再相差一位叠放累加)。

    中间出现了一个小问题困惑了我很久,就是那个长度问题,怎么保存并实时更新长度?

    一开始想的比较简单,觉得这根本不是问题,直接遍历while(x[i]) n++,这样就有了。后来发现这想法好愚蠢,因为相乘个位数有可能是0,(比较大的阶乘可能连着几十位都是0)所以直接PASS;

    后来想着麻烦点但是比较容易实现,就是多加一个参数,每次更新之后再传回实参值,然而就是这个知识点我给忘了,上网搜了也没弄好,在函数里改变形参的值之后,始终没办法传回实参(可能是太着急了),所以又放弃了;

    后来想到了一个办法,我只设了一个数组,那就好办,x[0]记录长度不就好了?(受KMP算法的影响),但是要改x[0]很麻烦,所以我直接设数组最后一位x[4999]记录长度。

    写到最后觉得已经实现了,验证了一下确实对,但是只能到77,这之后的阶乘算的是错的,之前的阶乘算的是对的,我就以为我的算法没问题,可能是数组在计算较大的值会有错误......

    然后给大佬看了下,大佬给我改了循环终止条件,我的循环终止在数字长度的地方,但是数字长度是实时更新的,我之前以为这样会使最后一位更新进位之后让新进的位值再乘一次(这里是想串了,这是和最开始的思路弄混了),其实有判断条件在那里,不会出错的,

    所以只要让循环终止条件是数字长度,再实时更新数字长度就行了。

  • 相关阅读:
    移动服务
    CodeForces
    poj1737-----这题有毒
    洛谷P1219 八皇后 (dfs+回溯法)
    codeforces 598D Igor In the Museum(dfs)
    CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)I
    复制构造函数的作用
    codeforces 1102D Balanced Ternary String(贪心+思维)
    学习3DES加密算法笔记
    个人冲刺(六)
  • 原文地址:https://www.cnblogs.com/longwind7/p/14293512.html
Copyright © 2011-2022 走看看