U173215 a+b and a*b without +-*/
a+b and a*b without +-*/ 给定 a,b ,求 a+b,a×b 。 但是你键盘上的 +-*/ 键坏了。也就是说,你的代码中不能含有 '+', '-', '*', '/' 。 对于 60% 的数据, 1≤a,b≤109 。 对于所有数据, 1≤a,b≤10103 。 60pts 的部分分答案不会超过 long long 范围,可以用位运算实现。 考虑加法二进制不进位的情况, a+b=a⊕b 。 而对于 a,b 的每一位 bit,只有当 abit=bbit=1 即 abit∧bbit=1 时才会进位。所有要进的位便是 a∧b 。 再用左移运算符来模拟进位。所以 a+b=(a⊕b)+((a∧b)<<1) ,后者的加法运算是可以递归实现的: inline long long add(long long a,long long b) { return b ?add(a^b,(a&b) << 1):a; } 乘法的实现则可以利用快速乘的思想,即 a∗b=a∗(b/2)∗2 ,后者的乘法运算也是可以递归实现的: inline long long mul(int a,int b) { long long res=b ?mul(a,b >> 1) << 1:0; return b&1 ?add(res,a):res; } 代码总体长度 300B 左右。 满分做法需要将高精度模板改写,主要考察对字符串的理解运用。 高精度的思想即按位运算(这里的位指十进制的位且默认从第 1 位开始)。 如果没有想到 60pts 的做法并实现对 10 的除法运算(可以二分结果实现,想法来源于 Loxilante ),需要 打表 出 0~9 的整数相加与相乘的结果。 下面代码中用 ad,nx,mu,ca 数组分别表示相加...