[英]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。
以下失敗,因為字母 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.