简单的加密与解密

题目:

某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,
在传递过程中需要加密,加密规则如下:
首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,
最后将第一位和最后一位数字交换。 请任意给定一个小于8位的整数,
然后,把加密后的结果在控制台打印出来。

题目要求:
A:数据是小于8位的整数
定义一个int类型的数据
int number = 123456;
B:加密规则
a:首先将数据倒序
结果 654321
b:然后将每位数字都加上5并除以10的余数代替该数字
结果 109876
c:最后将第一位和最后一位数字交换
结果 609871
C:把加密后的结果输出在控制台

* 注: 本程序使用到变长数组 有的编译器是不能通过编译的

C实现程序:

#include<stdio.h>

//10的m次幂
int f10m(int m)
{
    if(m<0)
    return -1;

    int mul=1;
    int i;
    for(i=1;i<m+1;i++)
    {
        mul*=10;
    }
    return mul;
}

// 求出整数的位数
int bits_integer(int integer)
{
    int count=0;
    while(integer/f10m(count))
    count++;
    return count;
}

// 求出整数对应位的值   (从右向左数)
int value_bit(int integer,int bit)
{

    return  integer%(f10m(bit))/(f10m(bit-1));
}

// int类型两位交换
void myswap(int*a,int*b)
{
    if(NULL==a||NULL==b)
    return;
	int tmp=*a;
	*a=*b;
	*b=tmp;
}
//
// 整数===>数组
// 参数:
//       flag=0  //逆序(数组第一位为最低位)
//       flag!=0 //顺序(数组第一位为最高位)
//       p指向转入的数组
void integer2array(int*p,int integer,int bits,int flag)
{
    if(NULL==p)
    return ;
    int i;
    for(i=0;i<bits;i++)
    {
        if(flag) //顺序(数组第一位为最高位)
        p[i]= value_bit(integer,bits-i);
        else     //逆序(数组第一位为最低位)
        p[i]= value_bit(integer,i+1);
    }
}


///      flag=0  //数组第一位为整数最高位)
//       flag!=0 //数组第一位为整数最高位)

// 数组===>整数
int  array2integer(int*array,int len,int flag)
{
    if(NULL==array)
    return -1 ;
    int integer=0;
    int i;
    if(flag)  //数组第一位为整数最高位
    for(i=0;i<len;i++)
    {
        integer+=array[i]*f10m(len-1-i);
    }
    else     //数组第一位为整数最高位
    for(i=0;i<len;i++)
    {
        integer+=array[i]*f10m(i);
    }
    return integer;
}




//加密
int code(int integer)
{
    //将整数每一位从后向前存入数组中
    int bits=bits_integer(integer);
    int a[bits];
    integer2array(a,integer,bits,0);

    //数组对应的数转化为整数
    int sum_integer=0;
	int i;
    for(i=0;i<bits;i++)
    {
        a[i]=(a[i]+5)%10;
        sum_integer+=a[i]*f10m(bits-1-i);
    }
    //将余数每一位放入数组中
    //int b_bits=bits_integer(sum_integer);
    int b[bits];
    integer2array(b,sum_integer,bits,1);
    //交换首尾位的数
    myswap(&b[0],&b[bits-1]);
    //求出加密后的数
    //数组对应的数转化为整数
	int code_integer= array2integer(b,bits,1);
    return code_integer;

}

int decode(int code_integer)
{
    int bits=bits_integer(code_integer);
	// 整数转数组
    int a[bits]={0};
    integer2array(a,code_integer,bits,1);
    myswap(&a[0],&a[bits-1]);

	// 数组转整型
    int tmp_integer=array2integer(a,bits,1);
//	printf("%d\n",tmp_integer);

	// 整数转数组
    int b[bits]={0};
    integer2array(b,tmp_integer,bits,1);

    int i;
    for(i=0;i<bits;i++)
    {
        if(b[i]<5)
        b[i]=b[i]+5;
		else
		b[i]=b[i]-5;
    }
    int integer=array2integer(b,bits,0);
    return integer;
}

int main()
{
    int n;
    scanf("%d",&n);
    printf("%d\n",code(n));
    printf("%d\n",decode(code(n)));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40144572/article/details/84452620