ページ 11

nの階乗を求めるプログラム

Posted: 2008年12月01日(月) 10:28
by makotyan
キーボードから整数nを読み込み、
nの階上 n!=1×2×3×…n
を求めて表示させるプログラムを求めたいのですが、よくわかりません。

あと条件に0以下または13以上の場合は再入力するみたいです。

Re:nの階乗を求めるプログラム

Posted: 2008年12月01日(月) 10:33
by Mist
この掲示板は丸投げ禁止です。

まず、キーボードから整数nを読み取るプログラムを作れませんか?

Re:nの階乗を求めるプログラム

Posted: 2008年12月01日(月) 11:02
by 初心者
階乗のプログラムはウェブ上にいくらでも載ってると思います。その中の1つを拝借
#include <stdio.h>
#include <stdlib.h>

#define ARRAY_SIZE 1000
#define SUPREMUM 10000

int main(void)
{
    int i, j, n, x, amari, p = 0, sho = 0;
    static int kekka[ARRAY_SIZE];

    do
    {
        printf("0以上の数を入力:");
        scanf("%d",&n);
    }
    while(n < 0);

    kekka[0] = 1;

    for(i = 0; i < n; i++)
    {
        for(j = 0; j <= p; j++)
        {
            x = kekka[j] * (i + 1) + sho;

            sho = x / SUPREMUM;

            amari = x % SUPREMUM;

            kekka[j] = amari;

            if(sho > 0 && p == j)
            {
                p++;
            }
        }
    }

    for(i = p, j = 1; i >= 0; i--,j++)
    {
        if(i == p)
        {
            printf("%4d",kekka);
        }
        else
        {
            printf("%04d",kekka);
            if( (j % 10) == 0 )
            {
                printf("\n");
            }
        }
    }
    printf("\n");

    return 0;
}


0以上の階乗計算プログラムのようですが13以下の条件はどっかにいれてください。これが実行できるかは
試してないのでわかりません。

Re:nの階乗を求めるプログラム

Posted: 2008年12月01日(月) 19:29
by たかぎ
いつもいうことですが、キーボードからの読み込みを行うための一般的な方法はありません。
とはいえ、エディタならキーボードから読み込んでくれそうなので、次のようにしてもよいでしょう。
#include <iostream>
#include <boost/static_assert.hpp>

template <int n>
struct factorial_helper
{
  static const int value = n * factorial_helper<n - 1>::value;
};

template <>
struct factorial_helper<0>
{
  static const int value = 1;
};

template <int n>
struct factorial
{
  BOOST_STATIC_ASSERT(0 < n && n < 13);
  static const int value = factorial_helper<n>::value;
};

int main()
{
  const int n = /* ←に好きな整数をキーボードで入力すること! */;
  std::cout << factorial<n>::value << std::endl;
  return 0;
}
こんなことを書くとまた怒られそうですが...。

Re:nの階乗を求めるプログラム

Posted: 2008年12月01日(月) 20:04
by lbfuvab
段階で考えましょう。但し、キーボード入力は標準入力と読みかえています。

①標準入力から数字を読み取る。

解説:scanfで良いと思いますよ。scanf("%d",&hoge);

②0以下か13以上なら繰り返し

解説:while文かfor文かdo-while文。

while(1){
  //処理
  if(hoge>1 && hoge<12)
    break;
}

③階乗の計算
解説:while文。

fact=1;
while(hoge)fact*=hoge--;

④表示
解説:printfです。

printf("%d\n",hoge);

こんなもんですかね。

Re:nの階乗を求めるプログラム

Posted: 2008年12月01日(月) 20:55
by 初級者
>lbfuvabさん

②に境界値バグがあります。
1の階乗と12の階乗が求まりません。

Re:nの階乗を求めるプログラム

Posted: 2008年12月01日(月) 21:21
by Dixq (管理人)
「よくわかりません」という質問は回答に困る場合が多いです。
質問の仕方がわからないときは、規約をよくよんで、規約にそって質問して下さい。

自分が今何処までわかっているか、書き、わかるところからアドバイス受けましょう。

Re:nの階乗を求めるプログラム

Posted: 2008年12月01日(月) 21:50
by lbfuvab
>②に境界値バグがあります。
>1の階乗と12の階乗が求まりません。

すいません。適当に読み替えてください。

Re:nの階乗を求めるプログラム

Posted: 2008年12月01日(月) 23:02
by conio
階乗は、再帰的関数の呼び出しの原理を理解する為の例題で時折見かけますね。
と言うわけで、再帰的な関数でやってみます。
-------------------------------------------------
#include<stdio.h>

int saiki(int n)/*再帰で階乗を求める*/
{
	if(n > 0) return(n * saiki(n - 1));
	else      return(1);
}

int main(void)
{
	int t;
	scanf("%d",&t);      /*値を入力する*/
	printf("%d",saiki(t));/*値の階乗を表示*/

	return(0);
}
----------------------------------------------------

以上です。
個人的に再帰は、パズルゲームで隣の色が同じかどうかを調べる時に非常に役に立ちました。(ぷよぷよ系)
あと、再入力の処理はあえて書いていません。
main関数の値を入力する部分に、do文などを実装するといいでしょう。
(何のことか分からない場合は、もう一度参考書等を読み返すと効率的に学習できると思います。)