C言語関係掲示板

過去ログ

No731 10000(1万)の階乗

[戻る] [ホームページ]
No.8965

ちょっと前の書き込み
投稿者---とも(2003/08/18 02:00:28)


ここにちょっと前まで書いてあったものを見たいんでが
どうすればいいですか?
過去ログにものってないんです。
ちなみに、10000(1万)の階乗について書いてあったものです。


No.8967

Re:ちょっと前の書き込み
投稿者---かずま(2003/08/18 04:50:05)



あったかもしれませんが、思い出せません。
そんな時は新たに書けばいいのでは、ということで書いてみました。
ちょっと時間はかかりますが、10000 ! が求められるはずです。
#include <stdio.h>

#define N    10000
#define MAX  35700

int multiply(int *a, int n)
{
    int i, c = 0;

    for (i = 0; i < MAX; i++)
        if (c = (a[i] = a[i] * n + c) >= 10)
            c = a[i] / 10, a[i] %= 10;
    return c;
}

void print(const int *a)
{
    int i = MAX;

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

int main(void)
{
    static int a[MAX] = { 1 };
    int i;

    for (i = 2; i <= N; i++)
        if (multiply(a, i)) break;
    if (i <= N) puts("  overflow");
    else printf("  %d! = ", N), print(a), puts("");
    return 0;
}


No.8968

Re:ちょっと前の書き込み
投稿者---かずま(2003/08/18 11:14:59)


> ちょっと時間はかかりますが、10000 ! が求められるはずです。
static int a[MAX]; は場所を取りすぎなので、
static char a[MAX]; にします。

printf と multiply の引数 int *a を char *a にします。
さらに、multiply の for ループは次のように変更します。

    for (i = 0; i < MAX; i++)
        if ((c += a[i] * n) < 10)
            a[i] = c, c = 0;
        else
            a[i] = c % 10, c /= 10;


No.8975

Re:ちょっと前の書き込み
投稿者---とも(2003/08/18 20:53:11)


>> ちょっと時間はかかりますが、10000 ! が求められるはずです。
><pre>

どうもありがとうございます。
ビタでこの書き込みでした。


No.8976

Re:ちょっと前の書き込み
投稿者---とも(2003/08/18 21:10:27)


>
>あったかもしれませんが、思い出せません。
>そんな時は新たに書けばいいのでは、ということで書いてみました。
>ちょっと時間はかかりますが、10000 ! が求められるはずです。
><pre>

このプログラムで、コンパイルをすると、
3.$$$ -3264: segment exceeds 64k
というエラーが出るんですが、どうしてでしょう?

No.8977

Re:ちょっと前の書き込み
投稿者---かずま(2003/08/18 22:24:59)


> このプログラムで、コンパイルをすると、
> 3.$$$ -3264: segment exceeds 64k
> というエラーが出るんですが、どうしてでしょう?
LSI C-86 の試食版を使っていますね。
static int a[MAX]; で a は何バイトになりますか?
LSI C-86 の場合、sizeof(int) = 2 なので、
35700 * 2 = 71400 バイトです。
そのコンパイラでは、64kバイト以上のデータは扱えないのです。

だから、static char a[MAX]; にしてください。
他の、int * もすべて char * にしてください。

それから、multiply で a[i] = 9、n = 10000 のとき
a[i] * n = 90000 となり、これも int の最大値 32768 を
超えています。次のようにして、この問題を回避しましょう。
 
int multiply(char *a, int n)
{
    int i;
    long c = 0;

    for (i = 0; i < MAX; i++)
        if ((c += (long)a[i] * n) < 10)
            a[i] = c, c = 0;
        else
            a[i] = c %10, c /= 10;
    return c;
}


No.8978

Re:ちょっと前の書き込み
投稿者---かずま(2003/08/18 22:28:15)


> a[i] * n = 90000 となり、これも int の最大値 32768 を
> 超えています。次のようにして、この問題を回避しましょう。

訂正。この場合、int の最大値は、32767 です。