本文主要是介绍1074 宇宙无敌加法器 (20 分)【有坑,做题时发现,可回顾】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目概述:
地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 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 <stdio.h>
#include <string.h>int main()
{int i,j,k,n,len_table=0,len_plus1=0,len_plus2=0,len_sum=0,temp=0,c=0,sum[21]={0};//len_sum为和的位数,c为进位 char table[21]={'\0'},plus1[21]={'\0'},plus2[21]={'\0'};scanf("%s",table);scanf("%s",plus1);scanf("%s",plus2);len_table=strlen(table);len_plus1=strlen(plus1);len_plus2=strlen(plus2);if (len_plus1>=len_plus2)len_sum=len_plus1;elselen_sum=len_plus2;for (i=len_plus1-1,j=len_plus2-1,k=len_table-1,n=0;;i--,j--,k--,n++){if (i>=0&&j>=0)temp=(plus1[i]-'0')+(plus2[j]-'0')+c;else if(i>=0)temp=(plus1[i]-'0')+c;else if(j>=0)temp=(plus2[j]-'0')+c;elsetemp=c;if (table[k]=='d'||table[k]=='0'){sum[n]=temp%10;c=temp/10;}else{sum[n]=temp%(table[k]-'0');c=temp/(table[k]-'0');}if (i-1<0&&j-1<0&&c==0)break;}for (i=n;i>=0&&sum[i]==0;i--);//对答案全0的情况特殊输出 if (i<0){printf("0");return 0;}for(i=n;i>=0;i--){if (sum[n]==0)n--;elseprintf("%d",sum[i]);}return 0;
}
Tips:
有坑,代码中已给出提示,易错点1是容易在正常输出时前面多打0,易错点2是排除多打0后,对于sum全0情况作特殊输出
提交结果:
这篇关于1074 宇宙无敌加法器 (20 分)【有坑,做题时发现,可回顾】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!