一、我們都知道int型別存盤不了12以后的階乘,在c語言里,而double型別,會存在很大的誤差,所以我們可以考慮用陣列來存盤大數階乘,(你也可以直接看代碼,里面我也寫了很清楚的注釋)
二、階乘,大家都很明白,
1!==1;
2!==1*2;
3!==1*2*3;
4!==1*2*3*4;
5!==1*2*3*4*5;
Firstly,a[0]直接賦值,為1的階乘,不然for回圈不好處理;現在a[0]為1,為一位數;
一直到3!都為一位數,我們就按照一位數來存,即,a[0]*2==2!,a[0]*3==3!
Secondly,當4!時,有兩位數了,現在a[0]里是6,即a[0]*4==4!(4*6==24),我們如何將4取出來存在a[0]中呢,24%10==4即可,但此時,多出一位數,我們便把它存在a[1]中,a[1]里我們要存數字2,如何得到數字2呢,24/10==2即可,后面的位數以此類推,
說實話,我思維不好,所以也是看了半天才看明白,所以在這里直接給大家上代碼,哈哈哈哈哈
#include<stdio.h>
int main()
{
int i, n, j;
int digit = 1;//位數的計數器,我們需要知道存在陣列里時,有多少位數
int num = 0;//數學乘法里進位數,如:12*6,個位為2,進位數為1;
int temp = 0;//每一位數相乘后的結果,如:上面個位相乘后為12,則temp=12;
int a[20001] = { 0 };//可以存200001個數字,已經很大了
a[0] = 1;//a【0】,也就是1的階乘,需要自己賦值,不然不好存
scanf("%d", &n);
for (i = 2; i <= n; i++)//這個控制算數字的階乘,i為幾,即算的是幾的階乘
{
num=0;
for (j = 0; j < digit; j++)//這個for回圈,則是控制每一位數的存盤,
{
temp = a[j] * i + num;
a[j] = temp % 10;
num = temp / 10;
}
while (num)//當然,num==0時,不需要進位;
{
a[digit] = num%10;//由于上面for回圈里,位數沒有包括當前位數,所以在這里存盤,當num為兩位數時,我們只要十位上的數字存在這里
num = num / 10;//退出回圈
digit++;//既然進了回圈,則表明位數多了一位,則加1;
}
}
for (i = digit-1; i >=0; i--)//因為我們存的數是和原來的數相反的,所以倒序輸出,就OK了
{
printf("%d", a[i]);
}
printf("\n");
return 0;
}
謝謝,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/390582.html
標籤:其他
上一篇:【LeetCode】每日一題——686. 重復疊加字串匹配
下一篇:LeetCode 222. Count Complete Tree Nodes - 二分查找(Binary Search)系列題13
