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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
makotyan

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

#1

投稿記事 by makotyan » 16年前

キーボードから整数nを読み込み、
nの階上 n!=1×2×3×…n
を求めて表示させるプログラムを求めたいのですが、よくわかりません。

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

Mist

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

#2

投稿記事 by Mist » 16年前

この掲示板は丸投げ禁止です。

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

初心者

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

#3

投稿記事 by 初心者 » 16年前

階乗のプログラムはウェブ上にいくらでも載ってると思います。その中の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の階乗を求めるプログラム

#4

投稿記事 by たかぎ » 16年前

いつもいうことですが、キーボードからの読み込みを行うための一般的な方法はありません。
とはいえ、エディタならキーボードから読み込んでくれそうなので、次のようにしてもよいでしょう。
#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;
}
こんなことを書くとまた怒られそうですが...。

lbfuvab

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

#5

投稿記事 by lbfuvab » 16年前

段階で考えましょう。但し、キーボード入力は標準入力と読みかえています。

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

解説: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の階乗を求めるプログラム

#6

投稿記事 by 初級者 » 16年前

>lbfuvabさん

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

Dixq (管理人)

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

#7

投稿記事 by Dixq (管理人) » 16年前

「よくわかりません」という質問は回答に困る場合が多いです。
質問の仕方がわからないときは、規約をよくよんで、規約にそって質問して下さい。

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

lbfuvab

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

#8

投稿記事 by lbfuvab » 16年前

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

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

conio

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

#9

投稿記事 by conio » 16年前

階乗は、再帰的関数の呼び出しの原理を理解する為の例題で時折見かけますね。
と言うわけで、再帰的な関数でやってみます。
-------------------------------------------------
#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文などを実装するといいでしょう。
(何のことか分からない場合は、もう一度参考書等を読み返すと効率的に学習できると思います。)

閉鎖

“C言語何でも質問掲示板” へ戻る