ここから本文です

c言語で20の階乗を取り扱いたいのですが、unsigned long intでもオーバーフローし...

xol********さん

2019/12/922:29:23

c言語で20の階乗を取り扱いたいのですが、unsigned long intでもオーバーフローしてしまいます。こういう場合、20の階乗を表示する方法はありますか?

閲覧数:
64
回答数:
4

違反報告

ベストアンサーに選ばれた回答

has********さん

2019/12/1006:57:21

「20の階乗を表示する方法はありますか?」
#include <stdio.h>
#define NUMSIZE 50
int main (void)
{
int i, j ;
int num [NUMSIZE] = {1} ;

for (i=1 ; i<=20 ; i++)
{
for (j=0 ; j<(NUMSIZE-1) ; j++)
{
num [j] *= i ;
}

for (j=0 ; j<(NUMSIZE-1) ; j++)
{
if (num [j] >= 9) {
num [j + 1] += num [j] / 10 ;
num [j ] %= 10 ;
}
}
}

i = NUMSIZE - 1 ;

while (num [i] == 0) i-- ;

while (i >= 0)
{
printf ("%d", num [i --]) ;
}

printf ("\n") ;

return 0;
}

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

Champdepiereさん

2019/12/1005:09:56

64bitのlong longで扱えなければ、BIGNUMライブラリを使いましょう。

lwx********さん

2019/12/923:11:18

unsigned long int で計算させた場合はこうなります:
0!:1
1!:1
2!:2
3!:6
4!:24
5!:120
6!:720
7!:5040
8!:40320
9!:362880
10!:3628800
11!:39916800
12!:479001600
13!:1932053504
14!:1278945280
15!:2004310016
16!:2004189184
17!:4006445056
18!:3396534272
19!:109641728
20!:2192834560

多倍長整数ライブラリで計算した場合(Boostのcpp_int使用)は20の階乗まで正常に計算できているのがわかります。
0!:1
1!:1
2!:2
3!:6
4!:24
5!:120
6!:720
7!:5040
8!:40320
9!:362880
10!:3628800
11!:39916800
12!:479001600
13!:6227020800
14!:87178291200
15!:1307674368000
16!:20922789888000
17!:355687428096000
18!:6402373705728000
19!:121645100408832000
20!:2432902008176640000

プロフィール画像

カテゴリマスター

あみやさん

2019/12/922:38:28

とりあえず、unsigned long long int の方が大きな数を扱えます。
それを超えるとなると標準の変数では扱えないので、
特殊な方法を取る必要があります。
多倍長整数で検索してみてください。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる