2016-06-25 22 views
0

pow()をmath.hライブラリのように実装するには、次のコードがあります。それはprintfの()関数から"power:"を印刷し 前のscanf()文は入力を取っているのはなぜprintf()の前にscanf()を実行する方法

  1. : まあ私は2つの質問がありますか?
  2. 計算された電力が22235645654789787978797797(例のような)のように、大きな整数の威力を計算するにはどうすればよいですか?どのように計算して印刷するのですか?あなたは、変数nの入力は)(のprintfから"power:"を印刷する前に入力を取っていないので、関係なく、あなたがどのような入力を入力するか見ることができる画像で

    #include <stdio.h> 
    unsigned long long int pow(unsigned long long int n,unsigned long long int d); 
    int main(){ 
    
    unsigned long long int a,x,n; 
    printf("Number:"); 
    scanf("%u\n",&a); 
    printf("power:"); 
    scanf("%u\n",&n); 
    x = pow(n,a); 
    printf("%u\n",x); 
    } 
    unsigned long long int pow(unsigned long long int n,unsigned long long int d){ 
    if(n+1==1) 
        return 1; 
    return d*pow(n-1,d); 
    } 
    

Image

ご理解ください。任意の提案やコメントのために開いてください。

+0

。 –

+0

[\ [this \]](http://stackoverflow.com/a/21860015/1620779)の回答を参照してください。 – sjsam

+1

[\ [this \]](http://stackoverflow.com/questions/21859277/behaviour-of-scanf-when-newline-is-in-the-format-string)の質問が重複している可能性があります。 – sjsam

答えて

3

printfscanfが順番に実行されます。バッファリングのために出力が乱雑に見えます。

"power:"が印刷されると、数値が入力されるまでフラッシュされないバッファーで終わります。 \nを追加すると、コンソール出力用にこれが解決されます。​​を明示的に呼び出して、バッファリングされた文字列を画面に印刷することもできます。

注:unsigned long longは正しく読み取られていません。 llu使用、または64ビット符号なし整数のための適切な書式指定子のためにthis Q&Aを参照してください:あなたは、scanf("%u\n",&n)を使用せずに\nscanf("%u",&n);を使うべきではありません

unit64_t a, x; 
... 
scanf("%"SCNu64, &a); 
printf("n: %"PRIu64"\n", x); 
1

。それは完璧に動作します。 2番目の質問では、通常、Cプログラミング言語ではこうした計算は見られません。それは隠されたバッファオーバーフローにつながります、他の誰かが私よりよく答えます。

+0

'unsigned long long'では、完璧ではありません。 –

+1

あなたはそうです、%lluを使用しているはずです。事は、\ nはここで問題を引き起こしています。 –

0

数字を正しく書式設定するためにコードを少し修正しました。プログラムがあなたの望むものをやり遂げると思います。

#include <stdio.h> 
unsigned long long int pow(unsigned long long int n,unsigned long long int d); 
int main(){ 

    unsigned long long int a,x,n; 
    printf("Number:"); 
    scanf("%llu",&a); 
    printf("power:"); 
    scanf("%llu",&n); 
    x = pow(n,a); 
    printf("%llu\n",x); 
} 
unsigned long long int pow(unsigned long long int n,unsigned long long int d){ 
    if(n+1==1) 
     return 1; 
    return d*pow(n-1,d); 
} 

テスト

Number:2 
power:10 
1024 
+0

あなたの例でうまくいきますが、Number:256とpower:25のような値を取ると、結果が '0'になってしまいました。 – bhansa

+1

256は、0に等しい8最下位ビットを有する.256平方和は16個であり、256個の立方体は24などである。だから、256のパワー25は非常に多くの変数を持ち、残りの数字は切り捨てられます。 –

+0

ニースですが、これはタイトルに記載されているように質問に答えません。 – sjsam

1

問題がscanf()printf()関数の呼び出しのためのフォーマット文字列です。

フォーマット文字列は、すべてのscanf()フォーマット文字列とprintf()フォーマット文字列「\ n」の

を含めることはできません「%uは」を使用しているが、それらは変数の型と一致するように、彼らは「%のLLU」を使用する必要があります

注:訂正されたコードであっても、結果の数値が十分大きければ、 'unsigned long long int'変数をオーバーフローし、プログラムは失敗します。ここで

は、最初の質問は、あなたが見つける(または書き込み)する必要があり秒BIGINTライブラリのために、回答されている、修正されたコードで調べて慎重に

#include <stdio.h> 
#include <stdlib.h> 

unsigned long long int myPow(unsigned long long int n, unsigned long long int d); 

int main(void) 
{ 
    unsigned long long int a,x,n; 

    printf("Number:"); 
    if(1 != scanf("%llu",&a)) 
    { 
     perror("scanf for first number failed"); 
     exit(EXIT_FAILURE); 
    } 

    printf("power:"); 
    if(1 != scanf("%llu",&n)) 
    { 
     perror("scanf for second number failed"); 
     exit(EXIT_FAILURE); 
    } 

    printf("n=%llu, a=%llu\n", n, a); 
    x = myPow(n,a); 
    printf("%llu\n",x); 
} 

unsigned long long int myPow(unsigned long long int n,unsigned long long int d) 
{ 
    if(n+1==1) 
     return 1; 
    return d*myPow(n-1,d); 
} 
+0

ありがとうございます。 – bhansa

関連する問題