質問
私は次のコードを動作させることはできません。
#include <stdio.h>
// I am not sure whethere I should void here or not.
int main() {
// when the first bug is solved, I put here arg[0]. It should be
// similar command line parameter as args[0] in Java.
int a=3;
int b;
b = factorial(a);
// bug seems to be here, since the %1i seems to work only in fprintf
printf("%1i", b);
return 0;
}
int factorial(int x) {
int i;
for(i=1; i<x; i++)
x *= i;
return x;
}
をどのように動作するようにコードを取得することができますか?の
解決
AInitakは、正しい答えを与えたが、私は1つの方法は、あなたがのを見つけることができることを追加したい、あなたのコードのバグは階乗ループでi
の値をプリントアウトすることであり、x
ます。
int factorial(int x) {
int i;
for(i=1; i<x; i++)
{
x *= i;
printf("%d, %d\n", i, x);
}
return x;
}
これは、あなたの出力が得られます。
1, 3
2, 6
3, 18
4, 72
5, 360
6, 2160
7, 15120
8, 120960
9, 1088640
10, 10886400
11, 119750400
12, 1437004800
13, 1501193216
14, -458131456
-458131456
これは、それが簡単に間違って起こっているのかを確認することができます。あなたはAInitakが説明された理由にそれを期待してどこループは停止しません。
他のヒント
あなたは、変数(x)は内部ループを終了し、あなたのループを修正しています。現在 X は32ビット整数の範囲をオーバーフローした後従ってループを終了し、負と非常に大きくなる。
コードは、数回の反復後に吹きますこれは、する必要があります:
int factorial(int n) {
int i, x = 1;
for (i = 2; i <= n; ++i) {
x *= i;
}
return x;
}
のN!のは非常に迅速に非常に大きくなるので、いっそのこと、あなたは、long
代わりに変数int
と戻り値のx
のを使用する必要があります。
これは、関数の定義や宣言するときvoid
除外するCに悪いスタイルです。だから、それを置く。
int main(void)
それはパラメータの数については何も変更しませんが、関数は(関数がそのせずにゼロのパラメータを持っている<=>のいずれか)があり、それはないだろうが、それは、唯一のゼロ引数を受け付け一つとして関数を宣言しますあなたが<=>を省略したときに受け入れられた引数の量や種類については何も言います。しかし、とと<=>なしの両方のバージョンは正しい。
をhref="https://stackoverflow.com/questions/693788/c-void-arguments/693883#693883">読みます。
#include<stdio.h>
#include<stdlib.h>
int main(int c,char *v[])
{
int x,y;
int *num;
if(c==1)
{
printf("Usage : programName : number");
return 0;
}
num=(int *)malloc(sizeof(int));
*num=atoi(v[1]);
x=1;y=1;
while(x<=*num)
{
y=y*x;
x++;
}
printf("Factorial of %d is %d ",*num,y);
free(num);
return 0;
}
あなたはどのようなエラーメッセージを得るのですか?
まず第一に、あなたの関数を宣言factorial
の前にのmain
。また、インデントを修正するために注意を払います。機能のあなたの宣言は<=>方法によって、正しいます。
私は階乗関数の大きい方の値を計算することができるようにするために、階乗計算のためにも、二重またはunsigned long型を使用することをお勧めします。
double fact( double n)
{
if ( n == 1)
return 1;
return n*(fact(n-1));
}
よりエレガント非再帰関数ます。
#include<stdio.h>
long long int fact(long long int);
long long int fact(long long int n){
long long int num = 1;
long long int fi = 0;
for(long long int i=2;i<=n;i++){
for(long long int j=1;j<=i;j++){
fi += num;
}
num = fi;
fi = 0;
}
return num;
}
int main(){
long long int n;
scanf("%lld",&n);
printf("%lld\n",fact(n));
return 0;
}