ACM-不同进制下的加法
来源:互联网 发布:java tomcat作用 编辑:程序博客网 时间:2024/05/17 08:57
加法是最基础的一种运算了,在ACM的题目中它也会以各种各样的形式出现,所以这里对其进行一些总结。这里主要讨论加法在不同进制下的实现过程,比如给出两个b进制下的数p和q,让计算出它们的和;假如继续增加条件,p和q的长度可以达到上百位(字符串),那么这种情况下,只有用最原始的方法进行模拟计算,即从个位开始,一位一位的相加求和进行计算。具体的实现方法的话,可以使用一个整型数组,将需要相加的各个数据的每一位累加到数组的对应位,最后再转化成对应进制即可,当然计算顺序需要从个位开始。下面的代码实现了这个过程,假设超过十进制后的数用'a'-'z'表示:
// 最大位数#define MAX 205int sum[MAX];char data[MAX];int n, b;// n个b进制数相加void add(){ int ma = 0; memset(sum, 0, sizeof(sum)); while(n--) { scanf("%s", data); int len = strlen(data); // 反转,对齐个位 reverse(data, data+len); for(int i=0; i<len; ++i) { if(isdigit(data[i])) { sum[i] += data[i]-'0'; } else { sum[i] += data[i]-'a'+10; } } ma = max(ma, len); } // 取模,进位 int carry=0; for(int i=0; i<ma; ++i) { sum[i] += carry; carry = sum[i] / b; sum[i] %= b; } // 最高位有进位 if(carry) { while(carry) { sum[ma] += carry; carry = sum[ma] / b; sum[ma] %= b; ++ma; } } // 去掉前导零,但需要留一个 while(ma>1 && sum[ma-1]==0) { --ma; } // 从最高位开始打印结果 for(int i=ma-1; i>=0; --i) { if(sum[i] < 10) { printf("%d", sum[i]); } else { printf("%c", 'a'+(sum[i]-10)); } } puts("");}
值得一提的是,java中的高精度整数biginteger,不仅可以处理大整数的各种运算,而且也能自定义整数的进制,这似乎变得十分方便了。
0 0
- ACM-不同进制下的加法
- ACM 多项式加法
- ACM 大数加法
- [ACM]模拟大数加法
- acm训练 多项式加法
- ACM-大整数加法
- acm题目--正整数n的加法组合的最大乘积的超快算法
- acm题目及我的程序(3)——正整数n的加法组合
- [ACM Steps] Hat's Fibonacci 大数加法 另一种节约空间的方法
- ACM程序设计 书中题目H(20进制的加法)
- java中"+"号在不同情况下的不同意义(加法运算符还是字符拼接符)
- EASY_PAT_ADVANCED LEVEL 1058 A+B IN HOGWART 不同进制数字的加法运算
- ACM超级水题-------统计不同数字的个数
- acm c语言训练 数不同的单词数
- ACM FAFU - 1406(高精度加法)
- 南邮ACM 1011 大数加法 JAVA解法
- ACM简单处理大数加法方法
- ACM~大数加法&&hdu题目样例
- nyoj.458 小光棍数【水题】 2015/03/15
- 网络互联参考模型
- IntentService简介
- UVa 10491 - Cows and Cars(概率)
- linux内核空间与用户空间信息交互方法
- ACM-不同进制下的加法
- week1note
- uva 590 最优决策(DP)
- uva 147 Dollars(DP)
- C/C++经典书籍推荐
- 十二、oc中autorelease的基本使用
- 新浪SAE ———— JavaWeb项目部署教程<数据库连接2> (源码)
- C++之多线程编程-三
- $.ajax异步操作的get或post提交