1樓:匿名使用者
//求階乘最後非零位,複雜度o(nlogn)
//返回該位,n以字串方式傳入
#include
#define maxn 10000
int lastdigit(char* buf);
int len=strlen(buf),a[maxn],i,c,ret=1;
if (len==1)
return mod[buf[0]- '0 '];
for (i=0;i =0;i--)
c=c*10+a[i],a[i]=c/5,c%=5;
} return ret+ret%2*5;
} 首先我們可以知道,
n!中因子5的數目為
k(n)=[n/5]+[n/25]+[n/125]+...
如果記f(n)為所求的n!去掉0後最後一位數字
g(n)為1*2*3*4*6*7*8*9*11*...*n最後一位數字
也就是g(n)是n!中去掉5的所有倍數後乘積的最後一位數
所以我們可以知道
f(n)*2^k(n)=g(n)*f([n/5]) (mod 10)
左邊要乘上2^k(n)是因為右邊去掉k(n)個5,所以左邊需要新增k(n)個2(2*5=10)來達到平衡
容易知道g(n)(n>=2)是個以10為週期的函式
式子f(n)*2^k(n)=g(n)*f([n/5]) (mod 10)
可以得出
f(n)*2^k(n)=g(n)*f([n/5]) (mod 5)
或者f(n) = g(n)*3^k(n) *f([n/5]) (mod 5)
記g(n) = g(n)*3^[n/5] (mod 10)
那麼我們得到
f(n) = g(n)*g([n/5])*g([n/25])*...
其中g(n)是週期為20的函式(n>=2)
上面程式中用到陣列就是g(n)
2樓:匿名使用者
c語言中階乘怎麼輸?
3樓:很多很多
1、不是直接輸入n!,需要一定的演算法才可以實現。具體方法是,首先開啟編輯器,準備好空白的c語言檔案:
2、在編輯器中輸入**,這裡所謂 n 的階乘,就是從 1 開始乘以比前一個數大 1 的數,一直乘到 n。c語言中可利用迴圈解決,可以假設迴圈變數為 i,初值為 1,i 從 1 變化到 n;依次讓 i 與 sum 相乘,並將乘積賦給 sum,最後輸出sum的值就可以了:
3、在編輯器中執行程式,隨意輸入一個數,按下回車鍵,即可列印出階乘的結果來:
4樓:官官
for (;;)console.writeline("的階乘值為", num, jc);console.writeline("你是否還需要使用此階乘計算器,1-是,2-否");int numb = int.
parse(console.readline());if (numb == 1){}if (numb == 2)}console.readkey();
5樓:元元子彈
c語言中階乘沒有直接表達的方法,並不是數學中的 n! 。
而且,c語言也沒有直接計算階乘的函式,所以只能自己寫一個函式來實現。
int fact(int n)
這樣呼叫fact(n)即可返回n的階乘。
為防止資料過大溢位,也可將int改為long,或加判斷檢測資料範圍。
更多參考
6樓:程式設計師的每一天
c語言經典例子之利用遞迴方法求階乘
7樓:風過滄海
沒有現在的階乘運算子。
可以自己寫函式實現
8樓:匿名使用者
int fun(int n)
9樓:大衍之
int i;
int n=5;
int k=1;
for(i=1;i<=n;n++)
k=l*i;
k就是了
【**等】c語言程式:對n的階乘求和,n=1到10
10樓:匿名使用者
分析下程式,階乘可以用遞迴做,也可以用迴圈做,這裡就放上這兩種**了。
一.遞迴:
#include
int f(int t)
int main()
程式分析:定義一個f函式,利用遞迴的特性,進行運算10*f(9) = 10*9*f(8) …… 直到到1時返回1得出結果:
二.迴圈:
#include
int main()
printf("%d", t1);
return 0;
}程式分析:直接用一個for迴圈進行自減即可完成,定義t1用於儲存結果
得出結果:
11樓:匿名使用者
#include
int main()
sum+=c;//把結果累加在sum中
}printf("%d",sum);
return 0;}
12樓:時間箭頭
#include
int main()
printf("%d的階乘求和結果是%d\n",n,s);
return 0;
}在輸入介面輸入10,按enter,得結果4037913
13樓:匿名使用者
計算從1到10各數階乘
的和,即1! + 2! + 3! + …… + 9! + 10! 的和
#include
int main(void)
printf("1到10各數階乘的和 %d\n",sum);
return 0;}
14樓:
#include "stdio.h"
int main(int argv,char *argc)結果:
15樓:匿名使用者
#include
int main()
sum=sum+factorial;
} cout<<"結果是:"< getchar; //顯示螢幕停止,不閃退getchar; return 0;} 16樓:逐夢兮樂 #include double fun(int n) int main() 祝你愉快! 17樓:獨思花知 #include"stdio.h" int main() sum += n; return 0;} c語言中怎麼得到任意整數的階乘末尾的0的個數? 18樓:匿名使用者 /* 算到0xffffffff的階乘沒 問題. 再大就要換資料專型別屬 了 */ #include unsigned long calc ( unsigned long n ) int main ( void ) 19樓:匿名使用者 先用for迴圈求階乘; 然後用取餘數的計算判斷一下最後一個數字是否為0,比版如97010%10,那麼就 權是餘數就是0,只要%10就行。餘數為0就把他輸出,不是0的不用管。也要一個迴圈來遍歷一下。 很簡單,自己寫好了。 另外任意整數是不現實的,必須定義一個最大值,要不計算機會溢位的,隨便給個最大值。比如99999,然後迴圈求從1到99999的連乘運算。最後迴圈用%10的方法,是0的就輸出,不是0的就罷了。 20樓:匿名使用者 int faczeros(int n) return rzt;} 1 首先開啟vc6.0,新建一個專案。2 新增標頭檔案。3 新增main主函式。4 定義int變數i。5 定義double型別變數sum,mix,並賦予初始值。6 使用for迴圈求sum。7 使用printf列印sum。8 執行程式,看看結果。錯誤比較多。語法錯誤 return後少 不解釋 1 主函... unsigned int jiechen unsigned int n 你好,這是我為你寫的程式,希望對你有用。程式和註釋如下 include using namespace std long jisuan int n 遞迴函式void main 反覆呼叫函式自身,直到滿足某一條件 include ... 其實吧,這個程式的核心思路也可以換種說法 就是給一個數由大到小排列 這一點你做出來了。一起 一下,我們一步步順著來看看 先來分析一下你那1100變成1001的問題 我用實際的過程讓你看一下程式執行過程吧 接下來是剝位置統計個數j,這一點很好。注意當前陣列的位置 然後實現了一次迴圈之後 第二重迴圈m ...c語言求1到n的階乘之和,c語言求1到n的階乘之和s
c語言用遞迴呼叫函式的方法求n的階乘,要具體解釋一下,具體到每一行
c語言求各位數字組成的最大數,C語言求各位數字組成的最大數