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