简体   繁体   中英

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. For example if the original number is F1 the input is 1F .

  • I can only use the standard library <stdio.h> , loops and conditions.

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'

With scanf(" %c", &reverse_char); while (reverse_char != '\\n') scanf(" %c", &reverse_char); while (reverse_char != '\\n') , reverse_char != '\\n' is always true. 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.

No character 10 @tkausl

Test against '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. Best take-away here:

Enable all warnings to save time.

int overflow

exp = exp * 20; can readily overflow int math even if sum in range.

For those EBCDIC aficionados : Character encoding

Below fails as the letter AJ are not all sequentially encoded.

//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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM