日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进制转化(北理乐学编程题目)

發布時間:2023/12/2 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进制转化(北理乐学编程题目) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們通常使用的都是十進制的數字,但其實在生活中也經常會使用其它進制。

這個題目會給你兩個不同的數字,它們不屬于同一進制,要求你計算出當它們分別處于何種進制之中時,兩個數字相等。譬如 12 和 5 ,在十進制下它們是不等的,但若 12 使用 3 進制而 5 使用六進制或十進制時,它們的值就是相等的。因此只要選擇合適的進制, 12 和 5 就可以是相等的。

程序的輸入是兩個數字 M 和 N( 其十進制的值不超過 1000000000) ,它們的進制在 2~36 之間。對于十以下的數字,用 0~9 表示,而十以上的數字,則使用大寫的 A~Z 表示。

求出分別在 2~36 哪種進制下 M 和 N 相等。若相等則輸出相應的進制,若不等則輸出錯誤信息。當然了,對于多種可能成立的情況,找出符合要求的進制最小的一組就行了。信息的格式見測試用例。

測試輸入期待的輸出時間限制內存限制額外進程
測試用例 1以文本方式顯示
  • 12?5?
  • 以文本方式顯示
  • 12?(base?3)?=?5?(base?6)?
  • 1秒64M0
    測試用例 2以文本方式顯示
  • 123?456?
  • 以文本方式顯示
  • 123?is?not?equal?to?456?in?any?base?2..36?
  • 1秒64M0
    測試用例 3以文本方式顯示
  • 10?A?
  • 以文本方式顯示
  • 10?(base?10)?=?A?(base?11)?
  • 1秒64M0
    測試用例 4以文本方式顯示
  • 12???456?
  • 以文本方式顯示
  • 12?is?not?equal?to?456?in?any?base?2..36?
  • 1秒64M0

    分析:因為可能用到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)

    總結

    以上是生活随笔為你收集整理的进制转化(北理乐学编程题目)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。