大数(小于10000)N的阶乘准确值(效率)
生活随笔
收集整理的這篇文章主要介紹了
大数(小于10000)N的阶乘准确值(效率)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?51Nod - 1057
對(duì)結(jié)果進(jìn)行切分,切分的寬度可以是 4、5 ,6,7,8.。
把結(jié)果存入 a[100000];? 這個(gè)數(shù)組中 ,假設(shè)每個(gè)元素存的是結(jié)果的5位,那么這個(gè)數(shù)組就能存 500000 位的數(shù),絕對(duì)足夠大。
比如? 10 != 3628800.。
那么在數(shù)組 a [] 的儲(chǔ)存情況是? a [ 0 ] = 28800,,a [ 1 ] = 36..
再比如? 一個(gè)數(shù)是 1 0 9 8 7 6 5 4 3 2 1? .。它的儲(chǔ)存情況是。。a [ 0 ] = 54321 ,a [ 1 ] = 09876 , a[ 2 ] = 1....
運(yùn)算的時(shí)候就像大數(shù)相乘,每個(gè)元素都要乘,如果這個(gè)元素超過了? 5 位,就進(jìn)位,加到下一個(gè)元素上,
以此類推。。
最后從后往前輸出數(shù)組。
要注意的是,如果 分割的寬度是 5 ,除了數(shù)組最后的元素不確定是不是 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 中有幾個(gè)元素。 for (i = 2;i <= n; ++ i){c = 0; // c 是 進(jìn)位的 數(shù)for (j = 0;j < len;++ j){a[j] = (a[j] * i + c ); // 注意每次乘都要 +c(加上 上次進(jìn)位的數(shù))c = a[j]/100000; //如果運(yùn)算結(jié)果小于 5 位,c 是為 0的。a[j] %= 100000; // 保證每個(gè)元素存5 位數(shù)}if(c > 0) // 經(jīng)過個(gè)循環(huán),如果 c > 0 了,就說明超過了5位,要進(jìn)位{a[j] = c; // a 新增個(gè)元素存進(jìn)位的數(shù)++len; // 那么就需要 len ++,記錄元素的個(gè)數(shù)。。}}printf("%d",a[--len]); // 先輸入最高的幾位,不確定有多少,也不用管。while(len)printf("%05d", a[--len]); // 后面的都是 5 位,注意格式。printf("\n");return 0; }總結(jié)
以上是生活随笔為你收集整理的大数(小于10000)N的阶乘准确值(效率)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: -9 逆序输出一个整数的各位数字_lee
- 下一篇: 从零开始学WEB前端——HTML理论讲解