PAT乙级 1074 宇宙无敌加法器

本文详细解析了PAT星人的特殊数字系统——PAT数的加法运算原理与实现过程,通过实例展示了如何处理不同进制位的加法,以及如何编写代码解决此类问题。

题目描述:
地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 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
输出样例:
7201

代码如下:

#include<iostream>
using namespace std;
int main()
{
    string s,s1,s2,c;
    cin>>s>>s1>>s2;
    int y=0,flag=0;
    s1.size()>s2.size()?s2.insert(0,s1.size()-s2.size(),'0'):s1.insert(0,s2.size()-s1.size(),'0');
    c=s1;
    for(int i=s1.length()-1;i>=0;i--){
        int mod=s[i]=='0'?10:(s[i]-'0');
        c[i]=(s1[i]-'0'+s2[i]-'0'+y)%mod+'0';
        y=(s1[i]-'0'+s2[i]-'0'+y)/mod;
    }
    if(y!=0) c='1'+c;
    for(int i=0;i<c.size();i++){
        if(c[i]!='0'||flag==1){
            cout<<c[i];
            flag=1;
        }
    }
    if(flag==0) cout<<"0";
    return 0;
}

来总结一下:
1)刚开始先让输入的s1和s2两个数达到相等的程度,不够前面补零,再做加法。
2)最后输出的时候要注意,最后一个测试点为好多个0,只能输出一个0,要单独判断一下。

PAT考试中,宇宙无敌加法器PAT乙级的题目(编号1074)。在地球人的数字系统里,习惯使用十进制数,且默认一个数字的每一位都是十进制;但在PAT星人开挂的世界里,每个数字的每一位都是不同进制的,这种数字被称为“PAT数”。 每个PAT星人都要熟记各位数字的进制表,例如“……0527”表示最低位是7进制数、第2位是2进制数、第3位是5进制数、第4位是10进制数等。每一位的进制d要么是0(代表十进制),要么是[2,9]区间内的整数。理论上这个进制表有无穷多位数字,不过实际应用中,PAT星人通常只需记住前20位,以后各位默认为10进制。在这样的数字系统中,简单的加法运算也变得复杂起来。比如对应进制表“0527”,计算“6203 + 415”时,要按不同进制逐位计算并处理进位,最终得到结果“7201” [^3][^4]。 在解决这道题时,有多种语言的实现代码。例如C++代码,通过逐位读取输入的规则、两个数字,按位相加并根据规则中的进制处理进位,最后处理结果前端多余的0,若结果为空则输出0 [^1]。Python代码也采用类似思路,根据短的PAT数逆序逐位计算,使用`str.rstrip('0')`函数去掉结果末端多余的0,当两数结果相加为0时,至少输出0 [^2]。 ### 代码示例(C++) ```cpp #include<iostream> #include<string> using namespace std; int main(){ string rule, a, b, ans = ""; int carry = 0, temp, cnt, power; cin >> rule >> a >> b; for(int i = a.size() - 1, j = b.size() - 1, cnt = rule.size() - 1; i >= 0 || j >= 0; i--, j--, cnt--){ if(i < 0) temp = b[j] - '0' + carry; else if(j < 0) temp = a[i] - '0' + carry; else temp = (a[i] - '0') + (b[j] - '0') + carry; if(rule[cnt] == '0') power = 10; else power = rule[cnt] - '0'; ans = to_string(temp % power) + ans; carry = temp / power; } if(carry) ans = to_string(carry) + ans; while(ans[0] == '0') ans.erase(0, 1); if(ans.size() == 0) cout << 0; else cout << ans; return 0; } ``` ### 代码示例(Python) ```python base=input() A=input() B=input() temp=A if len(A)>len(B): A=B B=temp a_len=len(A) b_len=len(B) l = b_len - a_len base_position=-1 pat='' jinwei=0 for i in range(len(A)-1,-1,-1): B_poistin =i+l sum=int(A[i])+int(B[B_poistin])+jinwei base_item=base[base_position] if base_item=='0': base_item=10 jinwei=int(sum/int(base_item)) pat=pat+str(sum%int(base_item)) base_position=base_position-1 for i in range(B_poistin-1,-1,-1): sum=jinwei+int(B[i]) base_item=base[base_position] if base_item=='0': base_item=10 jinwei = int(sum / int(base_item)) pat=pat+str(sum%int(base_item)) base_position = base_position - 1 if jinwei!=0: pat = pat + str(jinwei) pat_final=pat.rstrip('0') print_='' for i in range(len(pat_final)-1,-1,-1): print_=print_+pat_final[i] if print_: print(print_) else: print('0') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值