大数(小于10000)N的阶乘准确值(效率)
生活随笔
收集整理的這篇文章主要介紹了
大数(小于10000)N的阶乘准确值(效率)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?51Nod - 1057
對結果進行切分,切分的寬度可以是 4、5 ,6,7,8.。
把結果存入 a[100000];? 這個數組中 ,假設每個元素存的是結果的5位,那么這個數組就能存 500000 位的數,絕對足夠大。
比如? 10 != 3628800.。
那么在數組 a [] 的儲存情況是? a [ 0 ] = 28800,,a [ 1 ] = 36..
再比如? 一個數是 1 0 9 8 7 6 5 4 3 2 1? .。它的儲存情況是。。a [ 0 ] = 54321 ,a [ 1 ] = 09876 , a[ 2 ] = 1....
運算的時候就像大數相乘,每個元素都要乘,如果這個元素超過了? 5 位,就進位,加到下一個元素上,
以此類推。。
最后從后往前輸出數組。
要注意的是,如果 分割的寬度是 5 ,除了數組最后的元素不確定是不是 5 位, 其它的輸出都要 “%05d”。。!!
#include <cstdio> #include <algorithm> #include <iostream>using namespace std;int a[100000]={1,0}; int n,i,c,len,j;int main() {scanf("%d",&n);len = 1; // len 是用來記錄 a 中有幾個元素。 for (i = 2;i <= n; ++ i){c = 0; // c 是 進位的 數for (j = 0;j < len;++ j){a[j] = (a[j] * i + c ); // 注意每次乘都要 +c(加上 上次進位的數)c = a[j]/100000; //如果運算結果小于 5 位,c 是為 0的。a[j] %= 100000; // 保證每個元素存5 位數}if(c > 0) // 經過個循環,如果 c > 0 了,就說明超過了5位,要進位{a[j] = c; // a 新增個元素存進位的數++len; // 那么就需要 len ++,記錄元素的個數。。}}printf("%d",a[--len]); // 先輸入最高的幾位,不確定有多少,也不用管。while(len)printf("%05d", a[--len]); // 后面的都是 5 位,注意格式。printf("\n");return 0; }總結
以上是生活随笔為你收集整理的大数(小于10000)N的阶乘准确值(效率)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: -9 逆序输出一个整数的各位数字_lee
- 下一篇: rabbitmq direct 多个消费