1

このプログラムは与えられた整数の奇数の位置を示します。このプログラムはうまく機能しますが、123456789123 のように 10 より大きい整数を与えると、うまくいきません。RAMの問題なのかアルゴリズムの問​​題なのかわかりませんか?

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

main(){

    int a,b;
    int i = 0;

    scanf("%d",&a);

    while(a/10!=0){
        b=a%10;
        if(b%2!=0)
            printf("\nodd number position: %d",i);
        a=a/10;
        i++;
    }

    if(a%2!=0)
        printf("\nodd number position: %d",i);

    system("pause");
}
4

8 に答える 8

3

問題は、RAM ではなくプロセッサ (アーキテクチャ) にあります。あなたのプラットフォームでは、 のサイズはint32 ビットのようで、123456789123 ほど大きな数値を保持することはできません。Groo が Raon にコメントしたように、代わりに文字列を使用できます (数値に対して計算を行う予定がない場合)。

char a[1024] = {0}; /* should be plenty, but extend the array even more if needed */

fgets(a, sizeof a, stdin); /* fgets is recommended as it doesn't overflow */

int i, length = strlen(a);

for(i = 0; i < length; i++){
    /* count your odd digits here
       left as an exercise to the reader */
    /* note that you must access the individual digits using a[i] */
}
于 2013-10-24T11:08:46.283 に答える
1

すべてのデータ型は特定の範囲に制限されています。たとえばchar、範囲に制限されています-128 to 128。この範囲を超えて使用する場合。予期しない結果が得られる場合があります。

プログラムで整数の範囲を超える数値を指定すると、予期しない結果が得られます

int サイズが 4 バイト/32 ビットの場合、この範囲で入力を行うことができます–2,147,483,648 to 2,147,483,647

int サイズが 2 バイト/16 ビットの場合、この範囲で入力を行うことができます–32,768 to 32,767

このData Type Rangesを確認してください。

そして、大きな数値を与えたい場合は、変数を as として宣言することができlong int/long long int 、使用するときにフォーマット指定子を変更することを忘れないでlong int(%ld)くださいlong long int(%lld)

isdigit()また、文字列を使用して、ヘッダーの関数を使用してすべての文字が数字ではないかどうかを確認し、ctype.h'0' を減算して文字の数字を整数の数字に変換することもできます(character zero)。それが奇妙かどうかを確認します。

于 2013-10-24T11:13:16.427 に答える
1

問題は、123456789123 が整数データ型のストレージ制限を超えていることです。文字列を使用して値を格納し、解析してみてください。

#include<stdio.h>
int main(){
    char a[] = "12345678912345678913246798";
    int i = 0;
    for (i=0; a[i] != '\0'; i++){
        if ( a[i] % 2 != 0 ) printf("%c is odd\n", a[i]);
    }
    return 0;
}
于 2013-10-24T11:24:34.837 に答える
0

入力している数値が int の範囲を超えています。以下のリンクのデータ型を変更する必要があります。

http://www.tutorialspoint.com/ansi_c/c_basic_datatypes.htm

于 2013-10-24T11:08:24.560 に答える
0

予想されるデータ範囲に一致するデータ型を選択する必要があります。

プログラムを任意の数値に対して機能させたい場合は、一度に 1 文字ずつ読み取るのがおそらく最善です。

コード (このコードでは、位置は最上位桁 = 1 でカウントされます。これは、コードとは逆の方向です):

  int c;
  unsigned long long pos = 0;
  while (++pos) {
    c = getc();
    if (c < '0' || c > '9') break; // Not a digit
    if ((c - '0')%2 != 0) {
            printf("\nodd number position: %ulld", pos);
    }
  }

このコードは、途方もない桁数の数字を処理できます。ただし、最終的にはpos変数がオーバーフローします。

于 2013-10-24T11:13:45.180 に答える
0

123456789123intが0x1CBE991A83 32 ビットの場合、数値は (3197704835またはに0xBE991A83) 切り捨てられます。

于 2013-10-24T11:01:39.720 に答える
0

このプログラムは、10 桁を超えると適切な答えが得られないと思います。私が間違っている場合は修正してください。符号なし整数の最大値は 4294967295 です (任意の 32 ビット プロセッサで)。指定された値がそれを超える場合、その最大値に制限されるか、オーバーフローが発生します。したがって、4294967295 を超える整数を指定すると、想定どおりに機能しません。

入力を印刷してみてください。その場合、完全な数が送信されるか、奇数の位置を見つけるために最大数が送信されるかがわかります。

それを機能させる1つの方法は、入力数値を文字の配列として読み取り、奇数の位置を把握しようとすることです。

注: 符号付き整数の最大値は 2147483647 です

于 2013-10-24T11:05:02.850 に答える