问题 C: 对撞
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
小明发明了一个数字对撞机,两个位数相同的整数可以进行碰撞。碰撞过程中,将两个 整数的每一位进行比较,较小的那个数字会被撞得粉碎,较大的数字保留下来(如果两数 相同,都会保留)。例如下面例子中:
两个整数 13570 和 21673 碰撞后,对应数位上较小的值已经消失,碰撞的结果为:第一 个数字剩下 37,第二个数字剩下 2673。
现在小明想让你写一个程序来显示数字碰撞机的结果,输入两个整数,输出碰撞后的两 个数字。(注意最终结果不能包含多余的前导 0)
输入
第一行一个整数 x,表示输入的第一个整数。 第二行一个整数 y,表示输入的第二个整数。
输出
输出包含两行,第一个表示 x 碰撞后的结果。 第二行表示 y 碰撞后的结果。 若 x 或者 y 所有数位上的数字都消失了,该行输出“BOOM”注意都是大写的。
样例输入 Copy
【样例1】
13570
21673
【样例2】
300
500
【样例3】
1234
5678
样例输出 Copy
【样例1】
37
2673
【样例2】
0
500
【样例3】
BOOM
5678
提示
样例2解释
300第一位被撞碎了,剩下00,因为不能包含前导0,输出0。500没有任何一位被撞碎。
样例3解释
1234每一位都被撞碎了,输出“BOOM”,5678没有任何一位被撞碎。
【数据范围】
对于50%的数据,0≤x,y<10^9
对于80%的数据,0≤x,y<10^100,即x,y的长度不超过100。
对于100%的数据,0≤x,y<=10^1000,即x,y的长度不超过1000。保证所有x和y的位数相同,且x,y本身没有多余的前导0
思路:
好吧这是一道不算很难的题,但是当时就是卡了我好久qaq
先for循环判断每一位数字的大小,我把小的那一位标记为-1。然后先判断这个数组最后是否全是-1,如果全是-1就输出BOOM。如果不是全为-1呢,问题就来了,我写了一个函数去判断这个数组里是否只有-1和0,这样的话应该去掉多余的0,直接输出0,然后我自信满满就提交,结果wa的一败涂地
后来这样一组样例让我发现了错误
5030
6000
030
6000
按理说应该输出30和6000,结果多了一个零
最后在队友的帮助下写下了标记这个东西,在不等于-1的时候输出,如果这一位不是零,就标记一下,等到有一位是零并且做过标记的话,这个零就可以输出,这样就保证去掉了前导零
最后AC的代码是这样的
其实我也觉得自己写的很丑
string s1,s2;
int a[1005],b[1005];
int len1,len2;
int judge(int a[])
{
for(int i=0;i<len1;i++){
if(a[i] != -1)
return 0;
}
return 1;
}
int judge2(int a[])
{
for(int i=0;i<len1;i++){
if(a[i] != 0 && a[i] != -1)
return 0;
}
return 1;
}
int main()
{
cin >> s1 >> s2;
len1 = s1.size();
len2 = s2.size();
for(int i=0;i<len1;i++) a[i] = s1[i]-'0';
for(int i=0;i<len2;i++) b[i] = s2[i]-'0';
if(len1 == len2)
{
for(int i=0;i<len1;i++){
if(a[i] > b[i]) b[i] = -1;
else if(a[i] < b[i]) a[i] = -1;
}
}
int flag = 0;
if(judge(a)){ //如果全是-1输出BOOM
printf("BOOM\n");
}
else if(judge2(a)){ //如果除了-1就是0就输出0
printf("0\n");
}
else
{
for(int i=0;i<len1;i++){
if(a[i] != -1){
if(a[i] != 0){
flag = 1;
printf("%d",a[i]);
}
else if(a[i] == 0 && flag == 1)
//这一位是零,前一位不是这个零正常输出
printf("%d",a[i]);
}
}
printf("\n");
}
flag = 0;
if(judge(b)){
printf("BOOM\n");
}
else if(judge2(b)){
printf("0\n");
}
else
{
for(int i=0;i<len2;i++){
if(b[i] != -1){
if(b[i] != 0)
{
printf("%d",b[i]);
flag = 1;
}
else if(b[i] == 0 && flag == 1)
printf("%d",b[i]);
}
}
printf("\n");
}
return 0;
}