HDU2031 進位制轉換【進位制】
阿新 • • 發佈:2019-02-10
進位制轉換
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 53748 Accepted Submission(s): 29384
Problem Description 輸入一個十進位制數N,將它轉換成R進位制數輸出。
Input 輸入資料包含多個測試例項,每個測試例項包含兩個整數N(32位整數)和R(2<=R<=16, R<>10)。
Output 為每個測試例項輸出轉換後的數,每個輸出佔一行。如果R大於10,則對應的數字規則參考16進位制(比如,10用A表示,等等)。
Sample Input 7 2 23 12 -4 3
Sample Output 111 1B -11
Author lcy
Source
問題簡述 :參見上文。
問題分析:(略)
程式說明:
題意中已經明確指出,整數是32位的,所有字元陣列的長度取32+1即可。
本題還需要注意負數的處理!
這裡給出兩個版本的程式,一個使用指標實現,另外一個使用陣列下標。
題記:人們常用的是10進位制,進位制轉換是常見的問題。
AC的C語言程式如下(陣列):
/* HDU2031 進位制轉換 */ #include <stdio.h> #include <string.h> #define N 32 char ans[N + 1]; void reverse(char s[], int len) { int i,j; int c; for(i=(s[0]=='-'?1:0),j=len-1; i<j;i++,j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } void convert(int n, int r, char s[]) { int i = 0; // 處理負數 if(n < 0) { s[i++] = '-'; n = -n; } while(n) { s[i] = n % r; if(s[i] >= 10) s[i] += 'A' - 10; else s[i] += '0'; n /= r; i++; } s[i] = '\0'; reverse(s, i); } int main(void) { int n, r; while(scanf("%d%d", &n, &r) != EOF) { convert(n, r, ans); printf("%s\n", ans); } return 0; }
AC的C語言程式如下(指標):
/* HDU2031 進位制轉換 */ #include <stdio.h> #include <string.h> #define N 32 void reverse(char s[]) { int i,j; int c; for(i=(s[0]=='-'?1:0),j=strlen(s)-1; i<j;i++,j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } void convert(int n, int r, char *s) { char *t; t = s; // 處理負數 if(n<0) { *t++ = '-'; n = -n; } while(n) { *t = n % r; if(*t >= 10) *t = *t - 10 + 'A'; else *t = *t + '0'; n /= r; t++; } *t = '\0'; reverse(s); } int main(void) { int n, r; char t[N + 1]; while(scanf("%d%d", &n, &r) != EOF) { convert(n, r, t); printf("%s\n", t); } return 0; }