zoukankan      html  css  js  c++  java
  • C语言编程题目(5)单字符的位处理 数据加密

    题目如下:

      这道题目理解起来其实并不难,关键是加密算法的实现,这里先把关键函数贴上来:

    代码1

     1 char CharConv(char Mark)
     2 {
     3     int orgin_num = Mark;     // get ascii value of char
     4     int i = 0,temp = 0;
     5     int Arr[8],LeftArray[5];
     6     for(i=0;i<8;i++)
     7         Arr[i] = (Mark>>i)&1;   //save binary bit(8 bits per char) into array
     8     i = Arr[0];             //switch bit(0 <--> 1 2 <--> 3 4 <--> 5)
     9     Arr[0] = Arr[1];
    10     Arr[1] = i;
    11     i = Arr[2];
    12     Arr[2] = Arr[3];
    13     Arr[3] = i;
    14     i = Arr[4];
    15     Arr[4] = Arr[5];
    16     Arr[5] = i;
    17     temp = Arr[6] + 2*Arr[7];   //bits of circle left shift
    18     for(i=0;i<=5;i++)   
    19         LeftArray[(i+temp)%6] = Arr[i]; //  here try to save new bit order into new temporary array
    20     for(i=0;i<=5;i++)
    21         Arr[i] = LeftArray[i];   
    22     temp = 0;
    23     for(i=0;i<8;i++)             //calculate new char's ascii
    24         if(Arr[i] == 1)
    25             temp += my2pow(i);
    26     return (char)temp;           // return new char
    27 }

     

      值得注意的是调用了自定义函数my2pow,返回2的x幂次值,之所以不用系统的pow函数是为了避免类型转换的麻烦(参数、返回值都是double类型):

    1 int my2pow(int x){
    2     int i = 0,result = 1;
    3     while(i<x){
    4         result *= 2;
    5         i++;
    6     }
    7     return result;
    8 }

      得到单个字符的加密转换以后,可以新建字符串加密函数StrConv,循环调用上面的CharConv函数返回加密的完整字符串。

    代码2

    1 void StrConv(char *src,char *dst,int length){
    2     int index = 0;
    3     while(index < length){
    4         dst[index] = CharConv((char)src[index]);
    5         index++;
    6     }
    7 }

      函数接受三个参数,第一个参数是源字符串,第三个参数是源字符串的长度;第二个参数是存储加密后字符串的地址。函数结构也十分清晰、简单。出过一些错,不能用dst+index这种方法,会有问题,dst是char *类型,dst+1也就是:(dst指向的地址+1个字节)地址。

    代码3

     1 int main()
     2 {
     3     int N,index;
     4     char temp[21]={0};
     5     char *str_array[5][21]; // assume the value of N doesn't bigger than 5
     6     scanf("%d",&N);
     7 
     8     for(index=0;index<N;index++)
     9     {
    10         scanf("%s",temp);
    11         StrConv(temp,(char *)str_array[index],strlen(temp));
    12         memset(temp,0,sizeof(temp));
    13     }
    14     for(index=0;index<N;index++)
    15         printf("%s
    ",str_array[index]);
    16     return 0;
    17 }

      最后是main函数,根据题目要求来依次输入N组字符串,每组字符串长度不超过20字节。然后每输入一组给temp临时字符数组,马上加密、依次保存到str_array指针数组,最后循环输出str_array数组的N组解密值。代码第11行容易出错,传参的类型不一致可能存在潜在风险。

    执行结果:

        

  • 相关阅读:
    hdu 5916
    hdu 5918
    hdu 5914 Triangle
    hdu 5912Fraction
    遗传算法初学习
    hdu 5873 Football Games
    JAVA 定时器的三种方法
    java反射对实体类取值和赋值,可以写成通过实体类获取其他元素的数据,很方便哦~~~
    Eclipse设置Tab键缩进4个空格的步骤,也就是按一下Tab键输出四个空格
    Nginx 相关介绍(Nginx是什么?能干嘛?个人觉得写得比较好的文章,转载过来)
  • 原文地址:https://www.cnblogs.com/Higgerw/p/11428422.html
Copyright © 2011-2022 走看看