PAT(乙级)2020年春季考试 7-3 钱串子的加法 (20分)

7-3 钱串子的加法 (20分)
 

qcz.JPG

人类习惯用 10 进制,可能因为大多数人类有 10 根手指头,可以用于计数。这个世界上有一种叫“钱串子”(学名“蚰蜒”)的生物,有 30 只细长的手/脚,在它们的世界里,数字应该是 30 进制的。本题就请你实现钱串子世界里的加法运算。

输入格式:

输入在一行中给出两个钱串子世界里的非负整数,其间以空格分隔。

所谓“钱串子世界里的整数”是一个 30 进制的数字,其数字 0 到 9 跟人类世界的整数一致,数字 10 到 29 用小写英文字母 a 到 t 顺次表示。

输入给出的两个整数都不超过 1 位。

输出格式:

在一行中输出两个整数的和。注意结果数字不得有前导零。

输入样例:

2g50ttaq 0st9hk381
 

输出样例:

11feik2ir



代码讲解:此题是一个变化进制的大数相加的题目。。。只要模拟加法就好。。。
首先把各自的位数先对齐,对齐俩种办法,一种是把字符串调转过来。。这样就能
个位对个位十位对十位了,还可以像我这样强行对齐,把字符串长度小的强行移位
和长的一样长,我这样做的好处是输出方便一些。。。其实都一样了。




 1 #include<stdio.h>
 2 #include<string.h>
 3 char a[100005];
 4 char b[100005];
 5 void nuowei(char a[],int count)    //挪位函数方便对齐的
 6 {
 7     int i=strlen(a);
 8     while(i>=0)a[i+count]=a[i],i--;
 9     i=0;
10     while(i<count)a[i]=0,i++;
11 }
12 int s_n(char a)                         //将字符转换成我们需要的整形方便加法
13 {
14     int ret;
15     if(a>='0'&&a<='9')
16     ret=a-'0';
17     else
18     if(a>='a'&&a<='z')
19     ret=a-'a'+10;
20     else
21     ret=0;
22     return ret;
23 }
24 int main()
25 {    
26     scanf("%s %s",a,b);
27     int str_a=strlen(a),str_b=strlen(b);
28     int str=str_a>str_b?str_a:str_b;   //找到俩个字符串长度最大的那个
29     int num_a,num_b,jin=0,i;
30     nuowei(a,str-str_a);       //强行移位使他们底对底
31     nuowei(b,str-str_b);
32     for(i=str-1;i>=0;i--)
33     {
34         num_a=s_n(a[i]);
35         num_b=s_n(b[i]);
36         num_a=num_a+num_b+jin;
37         jin=num_a/30;
38         num_a=num_a%30; 
39         if(num_a<10)
40         {
41             a[i]='0'+num_a;
42          } 
43          else
44          {
45              a[i]='a'+num_a-10;
46          }
47     }
48     if(jin!=0)     //看最高位是否为0 如果不为0,就一起输出完了
49     {
50         printf("%d%s\n",jin,a);
51     }
52     else                 //如果为0,那你要看看有没有前导0,去掉,还有一种特殊的情况就是0+0要小心这个
53     {
54     i=0;
55     while(i<str&&a[i]=='0')i++;    //去掉前导0,顺便能判断是否是0+0情况
56     printf("%s\n",i==str?"0":a+i);
57     }
58     return 0;
59  } 

 




posted @ 2020-11-28 22:56  罪梦者  阅读(315)  评论(0)    收藏  举报