PAT_B_1074 宇宙无敌加法器
生活随笔
收集整理的這篇文章主要介紹了
PAT_B_1074 宇宙无敌加法器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述:
地球人習慣使用十進制數,并且默認一個數字的每一位都是十進制的。而在 PAT 星人開掛的世界里,每個數字的每一位都是不同進制的,這種神奇的數字稱為“PAT數”。每個 PAT 星人都必須熟記各位數字的進制表,例如“……0527”就表示最低位是 7 進制數、第 2 位是 2 進制數、第 3 位是 5 進制數、第 4 位是 10 進制數,等等。每一位的進制 d 或者是 0(表示十進制)、或者是 [2,9] 區間內的整數。理論上這個進制表應該包含無窮多位數字,但從實際應用出發,PAT 星人通常只需要記住前 20 位就夠用了,以后各位默認為 10 進制。在這樣的數字系統中,即使是簡單的加法運算也變得不簡單。例如對應進制表“0527”,該如何計算“6203 + 415”呢?我們得首先計算最低位:3 + 5 = 8;因為最低位是 7 進制的,所以我們得到 1 和 1 個進位。第 2 位是:0 + 1 + 1(進位)= 2;因為此位是 2 進制的,所以我們得到 0 和 1 個進位。第 3 位是:2 + 4 + 1(進位)= 7;因為此位是 5 進制的,所以我們得到 2 和 1 個進位。第 4 位是:6 + 1(進位)= 7;因為此位是 10 進制的,所以我們就得到 7。最后我們得到:6203 + 415 = 7201。輸入格式: 輸入首先在第一行給出一個 N 位的進制表(0 < N ≤ 20),以回車結束。 隨后兩行,每行給出一個不超過 N 位的非負的 PAT 數。輸出格式: 在一行中輸出兩個 PAT 數之和。輸入樣例: 30527 06203 415 輸出樣例: 7201AC代碼:
#include <stdio.h> #include <string.h>int main() {int nBase, nA, nB, nS = 21, base, a, b;char sBase[21] = {0}, sA[21] = {0}, sB[21] = {0}, sSum[22] = {0};// 讀取三組數字,以字符串形式存儲 scanf("%s %s %s", sBase, sA, sB);nBase = strlen(sBase);nA = strlen(sA);nB = strlen(sB);for(int i = 0; i < nBase; i++){// 把數組 A B代表的數字轉化為 整數 a, b // 此處用 nA,nB-i-1 控制每一組數的位置 [巧妙之處]a = nA <= i ? 0 : sA[nA - i - 1] - '0';b = nB <= i ? 0 : sB[nB - i - 1] - '0';// base代表該位置的進制 base = sBase[nBase - i - 1] == '0' ? 10 : sBase[nBase - i - 1] - '0';// 運算每位的值 sSum[nS - i - 1] += a + b;// 計算進位與否 sSum[nS - i - 2] += sSum[nS - i - 1] / base; sSum[nS - i - 1] = sSum[nS - i - 1] % base;}// 變為字符類型 // 注 如果不經過 sSum[i] += '0' 變換,則字符存儲是第一位' ',ASCII 編碼為0 for(int i = 0; i < 21; i++)sSum[i] += '0';// 保證第一位不為零 for(int first = 0; first < 21; first++)// 從前向后遍歷,找到第一個不是0字符的數字 if(sSum[first] != '0'){// 輸出第 first 位后的數字 puts(sSum + first);return 0;}// 若結果為0,則直接輸出0 printf("0");return 0; }ASCII碼附錄:(from百度百科)
轉載于:https://www.cnblogs.com/Robin5/p/11190705.html
總結
以上是生活随笔為你收集整理的PAT_B_1074 宇宙无敌加法器的全部內容,希望文章能夠幫你解決所遇到的問題。