2

私はいくつかの基本的なコーディングに取り組んできましたが、整数にスキャンする正しい方法を見つけようとして苦労しています。最初は x 変数で、2 番目は x が上げられる n です。5^5 を試すと、現在のコードで -287648 が返されます。

#include <stdio.h>
#include <math.h>

void x_to_the_n (void)
{
    int x=0;
    int n =0;
    long int y;
    printf("Enter a integer for X and N\n");
    scanf("%i\n%i\n",&x,&n);
        y=pow(x,y);
        printf("%i \n",y);
}

int main(void)
{
    x_to_the_n ();
    return 0;
}   
4

3 に答える 3

9

私はあなたが意味すると確信しています:

y = pow(x, n);
          ~~

y何にも初期化されないため、「奇妙な」結果が得られます。xあなたは(いくらかのガベージ)の累乗にレイズし、ガベージを取り出しています。

@0A0D がコメントで示唆しているように、より説明的な変数を使用する場合、この問題はより明白になることに注意してください。

int base = 0;
int exponent = 0;
long int result;
printf("Enter the base and exponent, on separate lines\n");
scanf("%i\n%i\n", &base, &exponent);
result = pow(base, result);
                   ~~~~~~~ oops!

また、@icepack が述べたように、yは であるlong intため、形式は%li(ではない%i)にする必要があります。

printf("%li\n", y);
于 2013-03-13T19:06:37.413 に答える
-2

整数の累乗を行う関数が必要な場合は、次のようなものを試すことができます

#include <stdio.h>
unsigned int_pow(int n, unsigned x);
int main(void)
{
    int n, x;    
    printf("Enter an integer (n) followed by the power (x) to raise to: ");
    scanf("%i %i", &n, &x);    
    printf("%i^%i = %i\n", n, x, int_pow(n, x));    
    return 0;
}
unsigned int_pow(int n, unsigned x)
{
    unsigned i, a = n;
    switch (x)
    {
      case 0:
        return 1;
      case 1:
        return n;
      default:
        for (i = 1; i < x; ++i) {
             a *= n;
        }
        break;
    }
    return a;
}

関数に渡された不正な値をチェックするコードを追加することができます。指数が大きいと、unsigned int データ型がオーバーフローします。unsigned long を返す関数を記述し、仮パラメータ x がより大きな数を処理するために unsigned long を取ることもできますが、大きな数を処理することがわかっている場合は、おそらく float 型を使用する必要があります。

戻り値を整数型として使用する必要があることがわかっている場合、このコードはうまく機能し、型変換を節約できます。

于 2014-12-22T07:20:38.237 に答える