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
.
<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.