PAT (Basic Level) Practice (中文)1074 宇宙无敌加法器(C语言)
2019-01-20 15:57
423 查看
程序员入门水平,贴出代码大家一起进步!
题目
地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 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
思路||总结
- 以字符串输入然后将字符串进行翻转再将每位转为整型。
- 对每一位进行相加并加上前一位的进位数字(第一位的进位默认为0),将得到的和对相应位的取余,即是得到的该位结果,循环进行即可。
- 注意最后一位可能会产生进位。
- 最后一个测试点的结果为0需要考虑到。
AC代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM 22 int main() { void Strrev(char str[]); char s1[NUM],s2[NUM],s3[NUM]; gets(s1); gets(s2); gets(s3); Strrev(s1); Strrev(s2); Strrev(s3); int l=strlen(s1); int i,num1[NUM]={0},num2[NUM]={0},num3[NUM]={0},nume[NUM]={0}; for(i=0;i<l;i++)//字符型转化为整型。 { if(s1[i]>='0'&&s1[i]<='9')num1[i]=s1[i]-'0'; if(s2[i]>='0'&&s2[i]<='9')num2[i]=s2[i]-'0'; if(s3[i]>='0'&&s3[i]<='9')num3[i]=s3[i]-'0'; }; int flag=0;//进位数字记录。 for(i=0;i<NUM;i++) { if(num1[i]==0)num1[i]=10;//0代表10进制。 nume[i]=(num2[i]+num3[i]+flag)%num1[i];//结果记录。 flag=(num2[i]+num3[i]+flag-nume[i])/num1[i]; }; flag=0;//输出位标志。 for(i=NUM-1;i>=0;i--) { if(nume[i]!=0||i==0)flag=1;//i==0表示当结果为0时的输出。 if(flag!=0)printf("%d",nume[i]); }; return 0; } void Strrev(char str[]) { int l=strlen(str); char *h,*r; h=str; r=h+l-1; while(h<r) { char t; t=*h; *h=*r; *r=t; h++; r--; }; }
相关文章推荐
- PAT (Basic Level) Practise (中文) 1074. 宇宙无敌加法器(20)
- PAT (Basic Level) Practise (中文)1074. 宇宙无敌加法器(20)
- PAT basic-level 1074 宇宙无敌加法器 笔记
- PAT (Basic Level) Practice (中文)1086 就不告诉你(C语言)
- PAT (Basic Level) Practice (中文)1075 链表元素分类(C语言)
- PAT (Basic Level) Practice (中文)1082 射击比赛(C语言)
- PAT (Basic Level) Practice (中文)1087 有多少不同的值(C语言)
- PAT (Basic Level) Practice (中文)1078 字符串压缩与解压(C语言)
- PAT (Basic Level) Practice (中文)1079 延迟的回文数(C语言)
- PAT 1074宇宙无敌加法器的代码实现及错误分析(C语言)
- PAT (Basic Level) Practice (中文)1088 三人行(C语言)
- PAT (Basic Level) Practice (中文)1077 互评成绩计算(C语言)
- PAT (Basic Level) Practice (中文)1080 MOOC期终成绩(C语言)
- PAT (Basic Level) Practice (中文)1089 狼人杀-简单版(C语言)
- PAT (Basic Level) Practice (中文)1081 检查密码(C语言)
- PAT (Basic Level) Practice (中文)1085 PAT单位排行(C语言)
- PAT (Basic Level) Practise (中文)1041. 考试座位号(15) C语言
- pat乙级真题 1074. 宇宙无敌加法器(20)
- PAT (Basic Level) Practise (中文)1003. 我要通过!(20) C语言
- PAT (Basic Level) Practise (中文)1017. A除以B (20) C语言