簡體   English   中英

將基數為 20 的數字轉換為十進制

[英]Converting a base 20 number to decimal

我被要求將以 20 為底的數字轉換為十進制,其中用戶以相反的順序輸入以 20 為底的數字。 例如,如果原始數字是F1則輸入是1F

  • 我只能使用標准庫<stdio.h> 、循環和條件。

這是我到目前為止所做的似乎不起作用的事情。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
    int sum = 0;
    int exp = 1;
    char reverse_char;
    printf("Enter a reversed number in base 20:");
    scanf(" %c", &reverse_char);
    while (reverse_char != '\n') {
        if ((reverse_char >= '0') && (reverse_char < '10') || ((reverse_char >= 'a') && (reverse_char < 'k')) || ((reverse_char >= 'A') && (reverse_char < 'k'))) {
            if ((reverse_char >= '0') && (reverse_char < '10')) {
                reverse_char = reverse_char - '0';
                sum += (reverse_char * exp);
                exp = exp * 20;
            }
            else if ((reverse_char >= 'a') && (reverse_char < 'k')) {
                reverse_char = reverse_char - 'a';
                sum += (reverse_char * exp);
                exp = exp * 20;
            }
            else
            {
                reverse_char = reverse_char - 'A';
                sum += (reverse_char * exp);
                exp = exp * 20;
            }
        }
        else {
            printf("%c is not a number in base 20", reverse_char);
            break;
        }
        scanf(" %c", &reverse_char);
    }
    if (reverse_char == '\n')
        printf("%d", sum);

}

至少有這些問題:

" %c"消耗前導空格,如'\\n'

隨着scanf(" %c", &reverse_char); while (reverse_char != '\\n') scanf(" %c", &reverse_char); while (reverse_char != '\\n')reverse_char != '\\n'始終為真。 這當然有助於“似乎不起作用”。 因為循環沒有結束。

scanf("%c", &reverse_char); %c之前沒有空格)在兩行代碼中可以在這里工作。

沒有字符 10 @tkausl

針對'9'測試。

// if ((reverse_char >= '0') && (reverse_char < '10')) {
if ((reverse_char >= '0') && (reverse_char <= '9')) {

這暗示 OP 並未啟用所有編譯器警告。 最好的外賣在這里:

啟用所有警告以節省時間。

int溢出

exp = exp * 20; 即使sum在范圍內,也可以很容易地溢出int math。

對於那些EBCDIC愛好者:字符編碼

以下失敗,因為字母 AJ 並非全部按順序編碼。

//if ((reverse_char >= 'a') && (reverse_char < 'k')) {
//            reverse_char = reverse_char - 'a';

推薦使用數組查找。

任意基數(受數字串限制)反轉數轉換函數

static const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
uint32_t toU32Reverse(const char *number, int base)
{
    uint32_t result = 0;
    const char *start = number;

    if(number && *number && base < sizeof(digits))
    {
        while(*(number)) number++;
        do
        {
            const char *pos;
            number--;
            if((pos = strchr(digits, toupper(*number))) && (pos - digits) < base)
            {
                result *= base;
                result += pos - digits;
            }
            else
            {
                result = 0;
                break;
            }
        }while(number > start);
    }
    return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM