-
题目描述:
-
读入两个小于10000的正整数A和B,计算A+B。需要注意的是:如果A和B的末尾K(不超过8)位数字相同,请直接输出-1。
-
输入:
-
测试输入包含若干测试用例,每个测试用例占一行,格式为"A B K",相邻两数字有一个空格间隔。当A和B同时为0时输入结束,相应的结果不要输出。
-
输出:
-
对每个测试用例输出1行,即A+B的值或者是-1。
-
样例输入:
-
1 2 1 11 21 1 108 8 2 36 64 3 0 0 1
-
样例输出:
-
3 -1 -1
100
-
[解题思路]
-
1.理清楚题目的思路:判断a,b的末尾k位是否相同(如1234与3234的末尾三位是相同的,而末尾四位是不相同的);
-
2.找到解决题目的入口:比如要判断1234与3234的末尾三位是否相同,只需要判断((1234)%1000(是否)==(3234)%1000)即可,这个思路比较简单
-
在论坛看到一种位运算的思想来解决这个问题,如下:
-
如上代码,现在一般是32位的,则[-1](二进制表示)=1111111111....11111(32个1),则-1<<k位既将 1111111111....11111(32个1)的右边k为置为0,假如k=4,则-1<<k=11111.....10000,|是位运算或,则有a|(-1<<k)=11111...1xyzw(xyzw为a的二进制数后四位),可知:<span style="font-size:14px;"> if((a|(-1<<k))==(b|(-1<<k))){ printf("-1\n"); } else printf("%d\n",a+b);</span>
a|(-1<<k)=11111...1xyzw
b|(-1<<k)=11111...1mnpq
-
所以这种判断方法是不正确的,只能判断a与b二进制的后k位是否相同而不是a与b的后k位,比如12与28的后2位就不能通过:
-
-
所以该题目解决方法为:
-
[题目网站]#include <stdio.h> #include<math.h> int a,b,k; int main() { while(scanf("%d %d %d",&a,&b,&k)&&a&&b) { k=pow(10,k); if(a%k==b%k){ printf("-1\n"); } else printf("%d\n",a+b); } return 0; }
-
http://ac.jobdu.com/problem.php?pid=1015
-
-
-
-
-