简体   繁体   English

将基数为 20 的数字转换为十进制

[英]Converting a base 20 number to decimal

I have been asked to convert a number in base 20 to decimal, where the number in base 20 is entered by the user in reverse order.我被要求将以 20 为底的数字转换为十进制,其中用户以相反的顺序输入以 20 为底的数字。 For example if the original number is F1 the input is 1F .例如,如果原始数字是F1则输入是1F

  • I can only use the standard library <stdio.h> , loops and conditions.我只能使用标准库<stdio.h> 、循环和条件。

This is what I have done so far that does not seem to work.这是我到目前为止所做的似乎不起作用的事情。

#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);

}

At least these problems:至少有这些问题:

" %c" consumes leading white-space like '\\n' " %c"消耗前导空格,如'\\n'

With scanf(" %c", &reverse_char); while (reverse_char != '\\n')随着scanf(" %c", &reverse_char); while (reverse_char != '\\n') scanf(" %c", &reverse_char); while (reverse_char != '\\n') , reverse_char != '\\n' is always true. scanf(" %c", &reverse_char); while (reverse_char != '\\n')reverse_char != '\\n'始终为真。 This certainly contributes to "does not seem to work."这当然有助于“似乎不起作用”。 as loop does not end.因为循环没有结束。

scanf("%c", &reverse_char); (no space before %c ) in two lines of code may work here. %c之前没有空格)在两行代码中可以在这里工作。

No character 10 @tkausl没有字符 10 @tkausl

Test against '9' .针对'9'测试。

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

This hints that OP is not enabling all compiler warnings.这暗示 OP 并未启用所有编译器警告。 Best take-away here:最好的外卖在这里:

Enable all warnings to save time.启用所有警告以节省时间。

int overflow int溢出

exp = exp * 20; can readily overflow int math even if sum in range.即使sum在范围内,也可以很容易地溢出int math。

For those EBCDIC aficionados : Character encoding对于那些EBCDIC爱好者:字符编码

Below fails as the letter AJ are not all sequentially encoded.以下失败,因为字母 AJ 并非全部按顺序编码。

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

Recommend to use an array look-up.推荐使用数组查找。

Any base (limited by the digits string) reversed number converting function任意基数(受数字串限制)反转数转换函数

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