7

宿題を出しますが、それを積み重ねます。多分あなたは私を助けることができます。以下のタスク。

キーボードの整数を 10 進法で読み取り、新しい数のシステムを確立します。

新表記のコンソール番号で出力します。

私は 2 から 10 のシステムのみを作成しましたが、10 から 36 までは作成できません。2 番目のループで次のようなものを作成しようとしました。

if ( result > 9 ) {
    printf("%c", 55+number);
} else {
    printf("%d", result);
}

私のコード:

#include <stdio.h>

int main() {
    int number, base;
    int i, result;
    
    scanf("%d %d", &number, &base);
    
    if ( number < base ) {
        printf("%d\n", number);
    } else {
        for ( i = base; i <= number / base; i *= base );
        for ( int j = i; j >= base; j /= base ) {
            result = number / j;
            printf("%d", result);
            number = number % j;
        }
        printf("%d\n", number%base);
    }
    return 0;
}
4

5 に答える 5

2

else条件にはいくつかの変更が必要です: 1. 値から数字への変換は、内部ループ最終
ループに適用する必要があります。両方の場所に追加する代わりに、最後のforのみを使用するのではなく、ループを に実行するだけです。2. マジック ナンバーを使用 する代わりに. 理解しやすく、ASCIIに依存しません-(A、B、C ...が連続していることに依存します)。 3.残りはOKです。 printf("%d\n", number % base)j > 0j >= baseprintf()\n
55result - 10 + 'A'

[編集] @nos は状態の問題を指摘しましたif()
したがって、削除して、さらに単純なソリューションを作成するようif ( number < base ) { ... else {に変更for (i = base;してください。for (i = 1;

  // } else {
    for (i = 1; i <= number / base; i *= base)
      ;
    int j;
    // for (j = i; j >= base; j /= base) {
    for (j = i; j > 0; j /= base) {
      result = number / j;
#if 1
      if (result > 9) {
        // printf("%c", 55 + result);
        printf("%c", result - 10 + 'A');
      } else {
        printf("%d", result);
      }
#else
      printf("%d", result);
#endif      
      number = number % j;
    }
    printf("\n");
  // }
于 2013-09-13T13:14:25.693 に答える
1
int number, base;
scanf("%d %d", &number, &base);

int divisor = base;
while (divisor <= number)
    divisor *= base;

while (divisor != 1) {
    divisor /= base;
    int digit = number / divisor;
    number -= digit * divisor;
    printf("%c", digit <= 9 ? digit + '0' : digit + 'A' - 10);
}
printf("\n");
return 0;

警告: ~200000000 より大きい数値の未定義の動作。

于 2013-09-13T13:09:57.923 に答える
1

あなたは正しい軌道に乗っており、答えに非常に近づいています。プログラムは、結果の数字を 2 か所に出力しています。

数字を出力する単一の関数を作成し、両方の場所で使用することをお勧めします。

void print_digit(int number) {
  // your code here
}
于 2013-09-13T13:25:04.780 に答える
0

文字と整数を追加できるので、次のようなものを試してください。

'A' + // some int value
于 2013-09-13T12:57:14.427 に答える
0

一方、アンダーフロー/オーバーフローしないソリューションが好きな場合は、すべての INT_MIN から INT_MAX までを処理し、UB を使用せず、INT_MIN <= number <= INT_MAX、2 <= base <= 36 入力するだけで構いません。再帰。

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

void print_digit(int x, int base) {
  int quot, rem;
  quot = x/base;
  if (quot) {
    print_digit(quot, base);
  }
  rem = abs(x%base);
  if (rem > 9) {
    printf("%c", rem - 10 + 'A');
  } else {
    printf("%d", rem);
  }
}

int main() {
  int number, base;
  scanf("%d %d", &number, &base);
  if (number < 0) {
    printf("-");
  }
  print_digit(number, base);
  printf("\n");
  return 0;
}
于 2013-09-13T13:54:44.287 に答える