階乗を求めるプログラムを作りたいのですが、どうも上手くいきません・・・。下のプログラムを作ってみたのですが、エラーになってしまいます。どなたか教えてください、お願いします!!

#include <stdio.h>

void main(void)
{
int i,j;
long a=1;

for (i=1; i<=10; i++){
for(j=1 ;j <=i; j++){
a=a*j;
}

printf("%3d %ld \n",i,a);
}
}

A 回答 (3件)

これって 1~10までの階乗を出力するってプログラムですよね?


実際に階乗の計算を行ってるのは2つ目のforループで行っていると
思いますが、その前にaを初期化してない為に前に計算した階乗の値が
残ってしまってるからじゃないかと思います。

for (i=1; i<=10; i++){
 a = 1; //←初期化
 for(j=1 ;j <=i; j++){
  a=a*j;
 }
 printf("%3d %ld \n",i,a);
}

もしくは...
int num = 10; //求める階乗数
int a,i;
for(i=1,a=1;i<=num;i++,a=a*i) printf("%3d %ld \n",i,a);

こんな感じになると思います。
    • good
    • 4

 回答は他のかたがなさっているので、アドバイスと称して苦言を一つ。



 プログラムが仕様通りの動作をしないとき、「どうも上手くいきません」「エラーになってしまいます」で片付けていたら、永久にプログラミングは上達しませんよ。

 プログラムを書いてみたが、思い通りに動かない。それは、プログラミングでは当たり前です。むしろそれからが始まりです。「どうも上手くいきません」とは、具体的にどういう現象が起きるのでしょう。「エラーになってしまいます」とは、どんなエラーメッセージが出るのでしょう。得られる手がかりを駆使してバグの原因を絞り込んでいくのがプログラミングです。

 また、エラーメッセージすら示さずに質問をするなんて、他人に対するものの聞き方も覚えてください。
    • good
    • 1

aの初期化のタイミングがおかしいのではないでしょうか。


各iについて出たaの値をそのまま(i+1)について使っていますから、
このままでは
1!
1!×2!
1!×2!×3!
  :
1!×2!×3!×・・・10!
を計算することになって、多分オーバーフローを起こします。
外側のforループと内側のforループの間で毎回
a=1
を実行すべきだと思います。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

QC言語の勉強をしていて、for文と戻り値を使った階乗について分からずに

C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに困っています。

以下の点に留意して、階乗を計算するプログラムを作成する。
階乗とは、数字を1つづつ減らしながら掛け合わせたものです。つまり
5の階乗:5×4×3×2×1=120
3の階乗:3×2×1=6
となります。
main内
1)整数型の変数kazu、kekkaを宣言する。
2)“階乗を計算します。”を表示する。
3)実行例と同様の表示になるように、“整数を入力してください”を表示し、入力された値を、変数kazuに読み込む。
4)作成する関数名は、kaijyoとし、kazuを引数とし、戻り値をkekka に代入する。
6)“○の階乗は ○です。”と表示する。

関数kaijyo内
1)引数を変数名xとする。
2)整数型の変数i、valを宣言する。
3)計算結果をvalに入れていくために、valを初期化する(下記注意参照)。
4)iをカウンターとするfor文と複合代入演算子を使って階乗を計算する。
5)valの内容が戻り値となるようにする。
注意:階乗を計算するために、for文の中で複合代入演算子を使って階乗を計算します。しかし、for文に入る前のvalの初期化には注意が必要です。0に何を何回かけても0だと言うことを思い出してください。

という問題です。

それで私は下の通りに作りました。



#include <stdio.h>

int kaijyo(int x);

void main(void)
{
int kazu,kekka,kaijyo,sum;


printf("階乗を計算します。\n");
printf("整数を入力してください");
scanf("%d",&kazu);
kekka=kaijyo(kazu);
printf("%dの階乗は%dです。",kazu,kekka);

}

int kaijyo(int x)
{
int i,val;
val=1;
x=1;

for(i=1;i<=val;i++){
x=x*i;
}
return val;
}

しかし、メイクして実行してもどの階乗でも256になってしまいます。
どこが間違っているのか分からずに困っています。
よかったら教えてください。
よろしくお願いします。
カテゴリを間違ってしまっていたらすみません。

C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに困っています。

以下の点に留意して、階乗を計算するプログラムを作成する。
階乗とは、数字を1つづつ減らしながら掛け合わせたものです。つまり
5の階乗:5×4×3×2×1=120
3の階乗:3×2×1=6
となります。
main内
1)整数型の変数kazu、kekkaを宣言する。
2)“階乗を計算します。”を表示する。
3)実行例と同様の表示になるように、“整数を入力してください”を表示し、入力された値を、変数kazuに読み込む。
4)作成す...続きを読む

Aベストアンサー

関数kaijyouの中の階乗計算における引数の設定が無茶苦茶になっています。
もう一度良く見直して見て下さい。
ヒント:この関数だと仮引数の意味が・・・

Q階乗の式

「5」と入力すると、「1*2*3*4*5=120」(階乗)と表示されるプログラムを組みたいのですが、
例で言うと120という計算結果は出せるのですが式の部分が出せません。
forまたはwhileによって作るんですが誰か式をうまく出すプログラムが分かる人いらっしゃいませんか?

Aベストアンサー

import java.io.*;

public class kaijyou {
public static void main(String[] args){
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

System.out.print("数字を入力=> ");
int x = Integer.parseInt(in.readLine());
int y=1;

System.out.print("結果は ");
for(int i=1;i<x;i++){

System.out.print(i+"*");
y=i*y;

}
System.out.print(x+"=" +y*x );
}
}

QC#での階乗

(a/b)^x 
上記のようなxの階乗の計算を,C#でしようとしているのですが,階乗を計算する関数を教えてください。

Aベストアンサー

えーと、それは階乗じゃなくて累乗ですね。

powという関数ありませんでしたっけ?
Cではあるんですが。

double pow(double x, double y)
xのy乗を返す。

今の場合ならpow(a/b, x)でいいでしょう。

QC言語 累乗の計算

プログラミングの課題が出たのですが
どうしても解けない問題が2問あったのでここで質問させてもらいます。

尚、私が書けた範囲で書いているので
根本的な間違えがありましたらご指摘ください。


「□」の部分がわかりません。

(1)任意の整数nを入力して4^nを計算するプログラミングを完成させよ

#include <stdio.h>
main(){
int i,n,x;
i=1;x=1;
printf("n=");
schanf("%d",&n);
while(i<=□){
        x=4*□;
i++;
}
printf("Answer=%d\n",x);
}



(2)e^xをテーラー展開したときのx^nの項の係数を求めるプログラミングを書け。

#include <stdio.h>
main(){
int i,n;
float x;
printf("Input Nunber");
scanf("%d",&n);

x=0

for(i=1;i<=n;i++){
x=□*x;
}
x=1/□;
purintf("Answer%f\n",x);
}




回答をお待ちしております。

プログラミングの課題が出たのですが
どうしても解けない問題が2問あったのでここで質問させてもらいます。

尚、私が書けた範囲で書いているので
根本的な間違えがありましたらご指摘ください。


「□」の部分がわかりません。

(1)任意の整数nを入力して4^nを計算するプログラミングを完成させよ

#include <stdio.h>
main(){
int i,n,x;
i=1;x=1;
printf("n=");
schanf("%d",&n);
while(i<=□){
        x=4*□;
i++;
}
pri...続きを読む

Aベストアンサー

No.2およびNo.3のTort_Capaです。


>累乗をどのように表せばいいのでしょうか?

 printf()関数で出力する部分のことでしょうか?
 printf()関数では計算した結果の値を出力します。たとえば、(1)では、整数nに3を入力して4^3を計算する場合は、printf()関数で
  Answer=64
と出力されます。

 (2)の
  purintf("Answer%f\n",x);
というのは、
  printf("Answer%f\n",x);
でないとエラーが出ますね。
 書式を(1)と合わせるのであれば、
  printf("Answer=%f\n",x);
となっていたほうが良いと思います。

Q2の累乗を計算するプログラムを作ったのですが・・・

C言語を用いて、2の累乗(2,4,8,16・・・)を
計算して表示するプログラムを

#include<stdio.h>
void main(void)
{
int i,s;
s=1;
for(i=1; i<=15; i++)
{
s=s*2;
printf("i=%2d s=%7d\n",s);
}
}

と打ち込んで実行したのですが、結果が

i= 1 s= 2
i= 2 s= 4
i= 3 s= 8
i= 4 s= 16
i= 5 s= 32
i= 6 s= 64
i= 7 s= 128
i= 8 s= 256
i= 9 s= 512
i=10 s= 1024
i=11 s= 2048
i=12 s= 4096
i=13 s= 8192
i=14 s= 16384
i=15 s= -32768

のように、2の15乗だけが負になってしまいました。
最初のintをdoubleやfloatに直して実行すればよいのかとも考えたのですが、
実行すると答えがすべて0になってしまい上手くいきませんでした。
どの部分がおかしいのでしょうか・・・;

C言語を用いて、2の累乗(2,4,8,16・・・)を
計算して表示するプログラムを

#include<stdio.h>
void main(void)
{
int i,s;
s=1;
for(i=1; i<=15; i++)
{
s=s*2;
printf("i=%2d s=%7d\n",s);
}
}

と打ち込んで実行したのですが、結果が

i= 1 s= 2
i= 2 s= 4
i= 3 s= 8
i= 4 s= 16
i= 5 s= 32
i= 6 s= 64
i= 7 s= 128
i= 8 s= 256
i= 9 s= 512
i=10 s= 1024
i=11 s= 2048
i=12 s= 4096
i=13 s= 8192
i=14 s= 16384
i=1...続きを読む

Aベストアンサー

No2です。

追記ですが、printfの変換指定子は型にあわせたものを使わなければ正しく表示されません。
long であれば %ld にしてください。

参考URL:http://ja.wikipedia.org/wiki/Printf

Qfloat型とdouble型の変数の違いを教えてほしいです

float型とdouble型の変数の違いを教えてほしいです
2Dゲームを作っててdoubleの変数を使ってたんですが使ってはだめだと先輩に言われたんです。
理由を聞いたら、先生が「doubleは使わないほうがいい」と言われたらしくてちゃんとした理由がわかりませんでした。
それを知って何をするということではないんですが、気になって調べても出てこなかったので質問させてください。
まだゲーム作りを始めたばっかりでぜんぜん詳しくないですが教えてくれたら助かります。

Aベストアンサー

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速にできたり、と様々です。
32bitCPUでは、32bitのfloatの方が扱いやすいでしょうが、64bitCPUでは64bitのdoubleの方が扱いやすいかもしれません。
Cのmath.hで使える標準関数はdouble型のものがほとんどです。三角関数は2Dのゲームでも使う機会が多いのではないでしょうか。sinもcosもdouble型です。内部演算は当然doubleですので、変数にfloatを使ったからと早くはならず、むしろfloat型の変数に入れるときに暗黙の型変換が発生する分遅くなる可能性もあります。

そういった背景を考え検討した結果、floatを使う方がよい、と判断したのならいいのですが、「先生に言われた」では理由になりません。
聞けるのなら、その先生に理由を聞いてください。真意がわからないうちは、鵜呑みしないことです。

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速...続きを読む

Q入力した数値を0~3乗するプログラム (C言語)

この前学校の授業でやり方がわからなかったことがあるので質問させていただきます。

scanfを使って入力した整数を0~3乗したものを出力するプログラムをかけ

ちなみに7を入力すれば、
7^0=1,7^1=7,7^2=49,7^343
と出力されるようにしなさい

という問題が出ました。

これは掛け算を使って作るのでしょうか?

このプログラムの作り方と解答例をご教授願います。

Aベストアンサー

以下のようにしてください。
--------------------------------------------
#include <stdio.h>
int main(void)
{
int result = 1;
int x;
int i;
printf("x=");
scanf("%d",&x);
printf("x=%d\n",x);
for(i = 0; i < 4;i++) {
printf("%d^%d=%d\n",x,i,result);
result = result * x;
}
return (0);
}
-----------------------------------------
7を入力したときの実行結果
x=7
x=7
7^0=1
7^1=7
7^2=49
7^3=343
--------------------------------------
CentOS release 5.6 (Final)
gcc バージョン 4.1.2 20080704 (Red Hat 4.1.2-50)
で動作確認済みです。

以下のようにしてください。
--------------------------------------------
#include <stdio.h>
int main(void)
{
int result = 1;
int x;
int i;
printf("x=");
scanf("%d",&x);
printf("x=%d\n",x);
for(i = 0; i < 4;i++) {
printf("%d^%d=%d\n",x,i,result);
result = result * x;
}
return (0);
}
-----------------------------------------
7を入力したときの実行結果
x=7
x=7
7^0=1
7^1=7
7^2=49
7^3=343
--------------------------------------
CentOS release 5.6 (Final)...続きを読む

QC言語で、数値の桁数を求めるには??

C言語で数値の桁数を求めるプログラムをもとめたいのですが
どうすればいいのでしょうか
int c;
int a;
c=12345;
a=printf("%d",c);

とするとaに桁数は入るのですが
cがPRINTF関数により表示されてしまいます

どうすればいいでしょうか?
わかる方はおしえてください、おねがいします。

Aベストアンサー

 sprintf 関数というのがあります。
 printf 関数とまったく同じですが、結果を変数に出力する点が違います。

 char dummy[10];
 int c, a;
 c=12345;
 a=printf(dummy, "%d",c);

 この dummy 変数には文字列 "12345" が入りますが、使わなければどうということはないです。

 C言語を使い始めてそろそろ10年になりますが、sprintf をこんなふうに使おうとは思いもしませんでした(^_^;
 なんか反則っぽいですけど、合理的ですね(笑)

 ちなみに、答えが0になるまで10で割っていって、割ることができた回数を数えるのが普通のやりかたです。

Q引数 戻り値 return文について

今、C言語を初めて勉強してます。

勉強していて、引数と戻り値、return文

についてよくわかりません。

どなたか詳しく素人にもわかるように教えて

頂けないでしょうか?よろしくお願いします。

Aベストアンサー

まず、関数とは何らかの処理をして結果を返してくれるものです。わざとらしい例ですが二つの数を足してその結果を返す関数を見てみましょう。

#include <stdio.h>

int add( int hoge, int piyo ){
return hoge + piyo;
}

int main(void){
int data;

data = add( 253, 434 );
printf( "%d", data );

return 0;
}

見てわかると思いますが、引数とは関数内の処理に使うデータです。
このデータは関数を呼び出すときに与えます。

add( 253, 434 )

すると与えられたデータは関数に渡され仮引数と言うものに格納されます。
この例では hoge に 253、piyo に 434 が格納されます。

int add( int hoge, int piyo ){

この仮引数は普通の変数のように使うことが可能なのです。

hoge + piyo

そしてこの結果を戻り値として return 文で返してやります。

return hoge + piyo;

返すとは具体的にどこへ返すのかと言うと呼び出したところへです。
ここでは main 関数内の呼び出し元です。

data = add( 253, 434 );

data と言う変数へは関数によって返された戻り値(関数値とか返却値とかとも言ったりします)が格納されます。つまり 253 と 434 を足した数です。

引数も戻り値も結局はデータです。処理させたいデータが引数で、処理した結果であるデータが戻り値です。

return は呼び出し元へ結果を返すためのものです。


C言語の関数にはいろいろな種類があります。

引数も戻り値もあるもの。

int add( int hoge, int piyo ){
return hoge + piyo;
}

引数はあるが戻り値のないもの。

void add( int hoge, int piyo ){
printf( "%d", hoge + piyo );
}

戻り値はあるが引数のないもの。

#include <stdlib.h>
#include <time.h>

int getRandNum(void){
srand( time( NULL ) );
return rand() % 500;
}

戻り値も引数もないもの。

void print(void){
printf( "%d + %d = %d", 253, 434, 253 + 434 );
}

これらの使い分けはデータの内容や型、処理の内容により適宜必要なものを使ってください。

まず、関数とは何らかの処理をして結果を返してくれるものです。わざとらしい例ですが二つの数を足してその結果を返す関数を見てみましょう。

#include <stdio.h>

int add( int hoge, int piyo ){
return hoge + piyo;
}

int main(void){
int data;

data = add( 253, 434 );
printf( "%d", data );

return 0;
}

見てわかると思いますが、引数とは関数内の処理に使うデータです。
このデータは関数を呼び出すときに与えます。

add( 253, 434 )

すると与...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング