您的位置:首页 > 其它

九度OJ:题目1015 还是A+B

2016-03-12 12:29 281 查看
题目描述:
读入两个小于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)即可,这个思路比较简单

在论坛看到一种位运算的思想来解决这个问题,如下:

<span style="font-size:14px;">	if((a|(-1<<k))==(b|(-1<<k))){
printf("-1\n");
}
else printf("%d\n",a+b);</span>
如上代码,现在一般是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的二进制数后四位),可知:

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







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: