Problem Description
读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……

Input
测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。

Output
对每个测试用例输出1行,即火星表示法的A+B的值。

Sample Input
1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0

Sample Output
1,0,1
1,1,1,0
1,0,0,0,0,0

此题不是一道难题,但是所涉及知识点较多:

  1. 字符串处理
  2. 质数
  3. 大数加法

在求质数方面,此题涉及到不超过30位,故可以使用打表,直接定义数组,在此不赘述。

加法方面,必定涉及到进位问题,因此需要从低位到高位进行加法运算,因此第一步需要进行字符串反转。

加法方面需要一位一位取出a,b中对应的数值,则设立ai,bi分别对a,b进行循环。此时需要考虑到a,b位数不对等的状况,因此在循环中必须有防止溢出的措施,当a[ai]=’\0’时,则终止ai 继续增加。而在取出每一位火星数中,一位火星数可能包含多个十进制位数,此时则需要一个循环,并设立aj,bj记录十进制位数,取出的结果放入atemp,btemp用于记录。
在进行加法时还需要考虑进位问题,设置sign用于记录进位。

代码如下

#include<stdio.h>
#include<math.h>
void pirmes(int pri[]);
int turnover(char str[]);
int sum(char a[],int la,char b[],int lb);
int main()
{int la,lb;char a[100],b[100];while(scanf("%s %s",&a,&b)!=EOF &&  //a,b不能为0( (a[1]==',' || a[0]!='0') && //若a[1]存在,号说明存在高位,则不会为0(b[1]==',' || b[0]!='0')){la=turnover(a);lb=turnover(b);sum(a,la,b,lb);}
}void pirmes(int pri[]){ //求质数,将结果保存到pri[]中int n,i,j,sign;pri[0]=2;n=1;for(i=3;n<31;i+=2){sign=1;for(j=3;j<sqrt(i)+1;j+=2){if(i%j==0){sign=0;break;}}if(sign)pri[n++]=i;}return;
}int turnover(char str[]){  //将读入的字符串进行反转,常规的方法int i,n,j;char temp[100];for(i=0;str[i]!='\0' && str[i]!=NULL;i++){temp[i]=str[i];}n=i-1;for(i=n,j=0;i>=0;i--){str[j++]=temp[i];//printf("%c",str[j-1]);}//printf("\n");return n;
}int sum(char a[],int la,char b[],int lb){  //求和int pri[30],ai,bi,aj,bj,atemp,btemp;//ai,bi用于对a,b进行遍历,aj,bj用于对a,b中一位火星数记其十进制位数,atemp,btemp分别记录一位火星数int nsum[40],ni,sign;pirmes(pri);ai=bi=ni=sign=0;while(a[ai]!='\0' || b[bi]!='\0' || sign!=0){   //对a,b字符串进行遍历aj=bj=atemp=btemp=0;if(a[ai]=='\0')                             //若遍历到结尾,则atemp返回0atemp=0;else{while(a[ai] != ','){                     //只要不为',',说明还是一位火星数,需要将其转化为对应十进制数if(a[ai] == '\0')                    //若此时已经遍历到首位,则防止继续遍历造成溢出{ai--;break;}//printf("a[%d]=%c,",ai,a[ai]);atemp+=(a[ai]-48)*(int)pow((double)10,(double)aj++);            //记录一位火星数
//                printf("atemp=%d,",atemp);ai++;
//                printf("ai=%d\n",ai);}ai++;}if(b[bi]=='\0')btemp=0;else{while(b[bi] != ','){if(b[bi] == '\0'){bi--;break;}btemp+=(b[bi]-48)*(int)pow((double)10,(double)bj++);bi++;}bi++;}//       printf("atemp=%d btemp=%d sign=%d pri[%d]=%d\n",atemp,btemp,sign,ni,pri[ni]);nsum[ni]=(atemp+btemp+sign)%pri[ni];            //一位火星数求和sign=(atemp+btemp+sign)/pri[ni];                //进位//       printf("%d\n",nsum[ni]);ni++;}while(--ni>=0){printf("%d",nsum[ni]);if(ni>0)printf(",");elseprintf("\n");}return 0;
}

转载于:https://www.cnblogs.com/cunchen/p/9464223.html

HDU 1230解题报告相关推荐

  1. hdu 2058 解题报告 - The sum problem

    hdu 2058 解题报告 - The sum problem 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2058 等差求和公式: Sn=(a1+aN ...

  2. BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5087 题目意思:找出第二个最长递增子序列,输出长度.就是说,假如序列为 1 1 2,第二长递增子序列是 ...

  3. BestCoder4 1002 Miaomiao's Geometry (hdu 4932) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4932 题目意思:给出 n 个点你,需要找出最长的线段来覆盖所有的点.这个最长线段需要满足两个条件:(1 ...

  4. BestCoder15 1002.Instruction(hdu 5083) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5083 题目意思:如果给出 instruction 就需要输出对应的 16-bit binary cod ...

  5. HDU 1506 解题报告 Largest Rectangle in a Histogram (单调栈)

    看题传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题意比较明显,就是找以某一个矩形为高的最大的矩形.这个题可以用单调栈来求解,需要注意的是如果从 ...

  6. BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4908 题目意思:给出 一个从1~N 的排列你和指定这个排列中的一个中位数m,从这个排列中找出长度为奇数 ...

  7. Fibonacci Tree HDU - 4786——解题报告

    立志用更少的代码做更高效的表达 Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do some ...

  8. hdu 1754 解题报告 I Hate It

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. HDU 1870解题报告(愚人节的礼物)

    愚人节的礼物 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %I64d , %I64u Java class ...

  10. hdu 2049 不容易系列之(4)——考新郎 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2049 写这篇解题报告时 我真的很气愤 对自己又一次犯下低级错误改了两个小时 int型的数据居然用%I6 ...

最新文章

  1. 小型工作室创业项目_为什么新开发人员应该在小型创业公司工作
  2. linux c 用户态 调试追踪函数 调用堆栈 定位段错误
  3. Red Hat忘记root密码,重置root管理员密码
  4. audio 小程序 放大_码code | 小程序新能力释放,人人都能拥有对话机器人
  5. iOS之性能优化·优化App的电池耗电量
  6. maven工程servlet实例之jar包冲突解决
  7. 怎样用CDN防篡改、抗攻击、控内容?一份CDN安全指南请查收
  8. 腾讯优图发布四大平台产品,持续开放视觉AI能力
  9. java数组 0912
  10. [软件工程-设计模式] GRASP软件设计的模式和原则
  11. 8086CPU的寄存器
  12. jQuery中的$.getJSON、$.ajax、$.get、$.post的区别
  13. 撕掉单词书,每天花10分钟做这件事,英语水平暴涨!
  14. discuz内置代码
  15. 网易云音乐api、QQ音乐api、黑马电商api、小说api、漫画api接口
  16. 目标检测系列1——Overfeat
  17. IPC之消息队列(Message Queue)
  18. linux编译poco静态库,Xcode 编译poco c++静态库
  19. 亲自面试汇丰银行面试题目总结
  20. 有趣题目和认知合集(持续更新)

热门文章

  1. UVa 10870 - Recurrences 矩阵快速幂
  2. 111 进程的创建和结束
  3. All Reduce算法汇总
  4. 转载-计算几何的题目
  5. JavaWeb基于session和cookie的数据共享
  6. HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)
  7. 【Struts1】--beanutils
  8. 转----cer文件和pfx文件的区别
  9. ruby学习笔记(7)
  10. SilverLight跨域访问及其常用的几种解决方法