个人训练赛第二十场:对撞

问题 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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
面对Hash函数领域取得的重大研究进展,Crypto 2004 会议总主席StorageTek高级研究员Jim Hughes 17 日早晨表示,此消息太重要了,因此他已筹办该会成立24年来的首次网络广播(Webcast )。Hughes在会议上宣布:“会中将提出三份探讨杂凑碰(hash collisions )重要的研究报告。”其中一份是王小云等几位中国研究人员的研究发现。17日晚,王小云教授在会上把他们的研究成果做了宣读。这篇由王小云、冯登国、来学嘉、于红波四人共同完成的文章,囊括了对MD5、HAVAL-128、 MD4和RIPEMD四个著名HASH算法的破译结果。在王小云教授仅公布到他们的第三个惊人成果的时候,会场上已经是掌声四起,报告不得不一度中断。报告结束后,所有与会专家对他们的突出工作报以长时的热烈掌声,有些学者甚至起立鼓掌以示他们的祝贺和敬佩。当人们掌声渐息,来学嘉教授又对文章进行了一点颇有趣味的补充说明。由于版本问题,作者在提交会议论文时使用的一组常数和先行标准不同;在会议发现这一问题之后,王小云教授立即改变了那个常数,在很短的时间内就完成了新的数据分析,这段有惊无险的小插曲倒更加证明了他们论文的信服力,攻击方法的有效性,反而凸显了研究工作的成功。   会议结束时,很多专家围拢到王小云教授身边,既有简短的探讨,又有由衷的祝贺,褒誉之词不绝。包含公钥密码的主要创始人R. L. Rivest和A. Shamir在内的世界顶级的密码学专家也上前表示他们的欣喜和祝贺。   国际密码学专家对王小云教授等人的论文给予高度评价。   MD5的设计者,同时也是国际著名的公钥加密算法标准RSA的第一设计者R.Rivest在邮件中写道:“这些结果无疑给人非常深刻的印象,她应当得到我最热烈的祝贺,当然,我并不希望看到MD5就这样倒下,但人必须尊崇真理。”   Francois Grieu这样说:“王小云、冯登国、来学嘉和于红波的最新成果表明他们已经成功破译了MD4、MD5、HAVAL-128、RIPEMD-128。并且有望以更低的复杂度完成对SHA-0的攻击。一些初步的问题已经解决。他们赢得了非常热烈的掌声。”   另一位专家Greg Rose如此评价:“我刚刚听了Joux和王小云的报告,王所使用的技术能在任何初始值下用2^40次hash运算找出SHA-0的碰。她在报告中对四种HASH函数都给出了碰,她赢得了长时间的起立喝彩,(这在我印象中还是第一次)。…… 她是当今密码学界的巾帼英雄。……(王小云教授的工作)技术虽然没有公开,但结果是无庸质疑的,这种技术确实存在。…… 我坐在Ron Rivest前面,我听到他评论道:‘我们不得不做很多的重新思考了。’”

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你数过天上的星星吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值