进制转化(北理乐学编程题目)
我們通常使用的都是十進制的數字,但其實在生活中也經常會使用其它進制。
這個題目會給你兩個不同的數字,它們不屬于同一進制,要求你計算出當它們分別處于何種進制之中時,兩個數字相等。譬如 12 和 5 ,在十進制下它們是不等的,但若 12 使用 3 進制而 5 使用六進制或十進制時,它們的值就是相等的。因此只要選擇合適的進制, 12 和 5 就可以是相等的。
程序的輸入是兩個數字 M 和 N( 其十進制的值不超過 1000000000) ,它們的進制在 2~36 之間。對于十以下的數字,用 0~9 表示,而十以上的數字,則使用大寫的 A~Z 表示。
求出分別在 2~36 哪種進制下 M 和 N 相等。若相等則輸出相應的進制,若不等則輸出錯誤信息。當然了,對于多種可能成立的情況,找出符合要求的進制最小的一組就行了。信息的格式見測試用例。
| 測試用例 1 | 以文本方式顯示 | 以文本方式顯示 | 1秒 | 64M | 0 |
| 測試用例 2 | 以文本方式顯示 | 以文本方式顯示 | 1秒 | 64M | 0 |
| 測試用例 3 | 以文本方式顯示 | 以文本方式顯示 | 1秒 | 64M | 0 |
| 測試用例 4 | 以文本方式顯示 | 以文本方式顯示 | 1秒 | 64M | 0 |
分析:因為可能用到A~Z,所以用字符數組來保存輸入的數據。? ?題目的要求是你輸入的兩個數據在某種進制下可以相等, 再結合用例我們可以想到公式:在某一個進制下,一個數據應為 各個位的數字 × (進制數的位數-1)次方 【sum = a[j] * pow (base,j-1)】,此外每一個數,他合法的最小進制轉化應該是各個位最小的數再加1 例如10 最小進制轉化為2? A最小進制轉化為 11;
這里函數的指針完全可以轉化為數組,只是為了好看~
#include <stdio.h> #include <math.h> #include <string.h>char a[50], b[50]; int c[50], d[50]; int main() {scanf("%s %s", a, b);void basechange(char *a, int);int startbase(char *x);basechange(a, 1);basechange(b, 2);/* for (int i = startbase(a); i <= 36; i++) //調試用printf("%d\n", c[i]);printf("\n");for (int i = startbase(b); i <= 36; i++)printf("%d\n", d[i]);*/for (int i = startbase(a); i <= 36; i++) {for (int j = startbase(b); j <= 36; j++) {if (c[i] == d[j]) {printf("%s (base %d) = %s (base %d)\n", a, i, b, j);return 0; //在這返回0 如果沒有結束就意味著不存在}}}printf("%s is not equal to %s in any base 2..36\n", a, b); }void basechange(char *f, int x) { //函數一:將一個數所有合法進制轉化并存下來int sum = 0; //這里由于要對兩個數據轉化,因此抽象了一個參數x表示哪一個數int startbase(char *x);for (int i = startbase(f); i <= 36; i++) {sum = 0;for (int j = 0; j <= strlen(f) - 1; j++) {char t = f[j];if (t > 60) {t -= 7;}t -= 48;sum += t * pow(i, strlen(f) - 1 - j);}if (x == 1) //對應參數xc[i] = sum;if (x == 2)d[i] = sum;}}int startbase(char *x) { //函數2 找最小合法進制轉化數int max = *x;for (int i = 0; i <= strlen(x) - 1; i++) {if (max < * (x + i)) {max = *(x + i);}}if (max > 60)max -= 7;max -= '0';max += 1;return max; }main函數中只分了三小部分:輸入數據,利用函數進行轉化,判斷是否有解。
if (x>60) x-=7; x-=48或x-='0'? ?可以將數字和字母都轉化為int 類數字(0~9 ASCII碼為48~57,A為65,A對應10,理論上應該是58,所以額外減去7)
總結
以上是生活随笔為你收集整理的进制转化(北理乐学编程题目)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北理乐学大学计算机实验4,北理乐学C语言
- 下一篇: 暑假学习打卡【2】——北理工乐学第一周第