zoukankan      html  css  js  c++  java
  • SCAU 10677 我们仍未知道那天所看见的花的名字

    10677 我们仍未知道那天所看见的花的名字

    时间限制:1000MS  内存限制:65535K

    题型: 编程题   语言: 无限制

    Description

        芽间、仁太、波波、安鸣、雪集、鹤见是昔日孩童时期总是一起结伴同玩的6位好朋友。自从小时候的一次意外后,大家的关系渐行渐远。
    随着时间的流逝,大家都为了自己的生活和理想各奔东西。
        某天,芽间要离开大家了,她给大家各留下了一封电子邮件。这时候,在名牌高中读书的雪集,仗着自己的电脑知识,
    把给仁太电子邮件内容(一句话)加密了。
    然后他留下了一段加密程序,因为他想看看读普通学校的仁太能不能解密出来的。
        但事实证明,学校的名牌与否不是最重要的,重要的是自己个人的努力。为了看到芽间给自己的信,仁太专门去学了C语言,
    然后把那句话解密出来了。你也能做到吗?
    

    Input

    以下是雪集的加密代码:
    void Encrypt(char msg[])
    {
    	char key[] = "sleepiforest";
    	int msgLen = strlen(msg);
    	int keyLen = strlen(key);
    	int offset;
    	for(offset=0;offset<msgLen;++offset)
    	{
    		msg[offset] ^= key[offset%keyLen]; // ^是异或运算
    	}
    	for(offset=0;offset<msgLen;++offset)
    	{
    		printf("%02x ",msg[offset]); //%x是十六进制
    	}
    }
    芽间的邮件里的内容msg传入上面的函数后,得到以下的输出。
    53 30 39 59 0e 48 18 4f 34 0a 01 13 16 18 48 28 15 44 28 00 06 45 0d 55 0d 52 4a 4a 50你能把msg的原文输出解密出来吗?
    

    Output

    根据加密程序,把这句话解密,然后输出出来即可。
    例如:假设解密出来的这句话是“WELCOME TO THE TEAM OF SCAU_ACM”。
    那么你只需要把这句话输出就可以了。
    提供一个模板:
    #include <stdio.h>
    int main()
    {
    	char msg[] = "WELCOME TO THE TEAM OF SCAU_ACM";
    	puts(msg);
    	return 0;
    }
    只需要把msg里的内容换成你解密出来的内容,提交即可通过。
    

    Sample Input

    Sample Output

    根据题目要求输出

    Hint

    一个字符也不能漏,不能错哦~~所以呢~~最好还是在解密程序里把解密后的串输出吧~~
    提供一个录入数据的代码:
    char bin[] = "53 30 39 59 0e 48 18 4f 34 0a 01 13 16 18 48 28 15 44 28 00 06 45 0d 55 0d 52 4a 4a 50";
    char msg[50];
    int len = (strlen(bin)+1)/3;
    for(int i=0;i<len;++i)
    {
    	这里可以用sscanf把bin内的数据录入到msg~~具体用法大家查资料吧~~
    }
    

    Source

    by 200930740513

    Provider

    admin

     

    #include<stdio.h>
    #include<string.h>
    
    void Encrypt(char msg[], int msgLen)
    {
        char key[] = "sleepiforest";
        int keyLen = strlen(key);
        int offset;
        for(offset=0;offset<msgLen;++offset)
        {
            msg[offset] ^= key[offset%keyLen];
            printf("%c",msg[offset]);
        }
        printf("\n");
    }
    
    
    
    int main()
    {
        char bin[] = "53 30 39 59 0e 48 18 4f 34 0a 01 13 16 18 48 28 15 44 28 00 06 45 0d 55 0d 52 4a 4a 50";
        char msg[50];
        int i;
        memset(msg, '\0', sizeof(msg));
        int len = (strlen(bin)+1)/3; 
        for(i=0;i<len; ++i)
        sscanf(bin+i*3, "%x", &msg[i]);
        Encrypt(msg, i-1);
        
        
        return 0;
    }

    解题报告:


    首先要知道异或的性质,因为之前写过加密的代码,所以稍微了解了异或的性质,所以一看到题目就知道Encrypt函数基本不用改变,但,似乎没那么简单对吗?

    题目可是提示了要用用sscanf函数,学新东西总是让人兴奋的……

    =================================================================================

    C C++的16进制表达方法

    如果不使用特殊的书写形式,16进制数也会和10进制相混。随便一个数:9876,就看不出它是16进制或10进制。   

    C,C++规定,16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A等等。

    其中的x也不区分大小写。(注意:0x中的0是数字0,而不是字母O)   以下是一些用法示例:   

    int a = 0x100F;

    int b = 0x70 + a;

    ==================================================================================

    头文件:#include<stdio.h>

     sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。    

    函数原型:

     int sscanf(const char *buffer, const char *format, [argument ]...);    

     buffer 存储的数据的字符串  

     format 格式控制字符串   

     argument 选择性设定字符串   

     sscanf会从buffer里读进数据,依照argument的设定将数据写回。

     成功则返回参数数目,失败则返回0,错误原因存于errno中

    ======================================================================-=========

    常见用法

    =================================================================================

    char buf[512] ;    sscanf("123456 ", "%s", buf);//此处buf是数组名,它的意思是将123456以%s的形式存入buf中!

    printf("%s\n", buf);

    结果为:123456 

    ===================================================================================

    取指定长度的字符串。

    如在下例中,取最大长度为4字节的字符串。    

    sscanf("123456 ", "%4s", buf);   

    printf("%s\n", buf);   

    结果为:1234

    ==================================================================================  

    取到指定字符为止的字符串。

    如在下例中,取遇到空格为止字符串。    

    sscanf("123456 abcdedf", "%[^ ]", buf);  //[]里必须有一个空格   printf("%s\n", buf);   

    结果为:123456   

    ===============================================================================

    取仅包含指定字符集的字符串。

    如在下例中,取仅包含1到9和小写字母的字符串。   

    sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);   

    printf("%s\n", buf);   

    结果为:123456abcdedf

    当输入:   

    sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);   

    printf("%s\n",buf);   

    结果为:123456 

    =============================================================================

    取到指定字符集为止的字符串。

    如在下例中,取遇到大写字母为止的字符串。   

    sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);   

    printf("%s\n", buf);   

    结果为:123456abcdedf

    ==========================================================================

    给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,

    先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中   

    sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);   

    printf("%s\n", buf);   

    结果为:12DDWDFF ----------------

    这里会发现,如果在 "%*[^/]/%[^@]" 没有输入第二个‘/’时,即:sscanf( s, "%*[^/]%[^@]", buf );

    结果为:/12DDWDFF -----------------

    根据楼上的  "%[^A-Z]" 和 输出可知,取到的字符并不包括[]号里面的(也就是A-Z), 所以按理来所

    这里也不包括‘/’,既不会忽略‘/’而是把它输入到buf中,难道在[]外面加上/会起到省略的作用吗?

    再试试:改成 sscanf( s, "%*[^/]/%[^@]@", buf );  //增加了一个@

    结果为:12DDWDFF ----------------

    再试试:改成 sscanf( s, "%*[^/]/@%[^@]", buf );  //增加的@放在第二个‘/’的位置

    结果为:X!!@ ------------

    再试试:改成 sscanf( s, "%*[^/]/12%[^@]", buf );  //增加了字符串里面的‘1',‘2’

    结果为:DDWDFF --------------

    然而: 改成:sscanf( s, "%*[^/]12%[^@]", buf );  //删去第二个‘/’,猜到的结果是:/DDWDFF

    结果为:X!!@

    ………………………………

    ====================================================================

    给定一个字符串"hello, world",仅保留world。

    (注意:","之后有一空格,%s遇空格停止,加*则是忽略第一个读到的字符串)   

    sscanf("hello, world", "%*s%s", buf);   

    printf("%s\n", buf);   

    结果为:world   

    %*s表示第一个匹配到的%s被过滤掉,即hello,被过滤了   

    如果没有空格则结果为NULL。

    =============================================================================

  • 相关阅读:
    用户(三)
    首页和token验证(二)
    项目初始化和登录退出(一)
    VSCode设置vue/react模板
    Git操作
    C#可视化程序设计第三章(1,2)
    C#可视化程序设计第二章(3,4)
    SQL数据库第五章
    C#可视化程序设计第一章
    SQL数据库第四章
  • 原文地址:https://www.cnblogs.com/liaoguifa/p/2778706.html
Copyright © 2011-2022 走看看