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