编程计算并输出1~50之间的所有数的阶乘(大数阶乘)
如果使用普通的方法,當(dāng)階乘計(jì)算到13!時(shí)數(shù)據(jù)就開始出現(xiàn)問題,因?yàn)閕nt型數(shù)據(jù)無法保存這么大的數(shù)字,即使換成long ,long long ,double等也無法容納,所以我們需要使用大數(shù)的方法來完成這道題目。
所謂大數(shù)就是將一個(gè)極大的數(shù)值拆分開來,每一位的數(shù)字都作為數(shù)組的一個(gè)元素保存起來,下面我將一步一步講解這個(gè)代碼如何實(shí)現(xiàn)
首先聲明變量 a用于儲(chǔ)存大數(shù),數(shù)組大小可以賦予任意較大值,足夠保存即可
我們可以將大數(shù)的每一位分別與一個(gè)數(shù)字相乘,得到一個(gè)臨時(shí)數(shù)據(jù),對(duì)該數(shù)據(jù)取余保留當(dāng)前項(xiàng),進(jìn)位加到下一項(xiàng),即可得到每一位的數(shù)值
for(j=1,jw=0; j<=w; j++){t = a[j-1] * i + jw; // 使被拆分為數(shù)組的大數(shù)的每一項(xiàng)與 i 相乘并且加上進(jìn)位 a[j-1] = t % 10; // 將余數(shù)存到當(dāng)前項(xiàng)中 w = t / 10; //取進(jìn)位 } while( jw ){a[++w-1] = jw % 10;jw /= 10; }例子:
數(shù)據(jù) 9 *11
a[0] =9;
t = a[0]*9;
a[0] = t%10 = 9
a[1] = t/10 =9
當(dāng)存在進(jìn)位的時(shí)候,位數(shù)增加,并將進(jìn)位%10后進(jìn)到下一位中,若進(jìn)位大于十,則循環(huán)一直往后加。
因?yàn)榇髷?shù)的數(shù)據(jù)在數(shù)組中為逆序排序,所以只需倒序遍歷輸出數(shù)組即可得到答案
完整代碼:
#include<stdio.h> int main() {int jw,w=1,t,a[5000]; int i,j,z; // Jw為進(jìn)位 W為位數(shù) a為大數(shù)儲(chǔ)存 T儲(chǔ)存臨時(shí)數(shù)據(jù) a[0] = 1;for(i=1; i<=50; i++){for(j=1,jw=0; j<=w; j++){t = a[j-1] * i + jw; // 使被拆分為數(shù)組的大數(shù)的每一項(xiàng)與 i 相乘并且加上進(jìn)位 a[j-1] = t % 10; // 將余數(shù)存到當(dāng)前項(xiàng)中 jw = t / 10; //取進(jìn)位 } while( jw ){a[++w-1] = jw % 10;jw /= 10; }//當(dāng)有進(jìn)位的時(shí)候?qū)⑦M(jìn)位給到下一項(xiàng) for(z = w; z>=1; z--){printf("%d",a[z-1]);}printf("\n"); }return 0;}
計(jì)算結(jié)果如圖
總結(jié)
以上是生活随笔為你收集整理的编程计算并输出1~50之间的所有数的阶乘(大数阶乘)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 frida+dexdump对apk
- 下一篇: C语言程序设计 | 打印一个n行的菱形