1048 数字加密

本文深入探讨了数字加密的原理和应用,包括常见的加密算法如DES、AES,以及现代密码学的基础。通过理解加密过程和密钥管理,读者将能够更好地保护自己的数字信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路一:
1.定义一个字符数组map[13]用来存储对13取余后的结果
2.将要输入的数定义为字符数组,这样就方便对位计算,并且分
别计算出两个数组的长度
3.由于题目说明令个位为第一位,所以我们可以从第数组长度
-1位开始计算并计数(分奇偶位),注意让每位字符转换成数字,
方便进行计算
4.最后从结果字符数组中从最后一位开始输出
#include <stdio.h>
#include <string.h>
const char map[13] = { '0','1','2','3','4','5','6','7','8','9','J','Q','K' };	//const定义符号常量 
int main()
{
    char A[101], B[101], result[101];
    scanf("%s %s", A, B);
    int count = 0, i=strlen(A)-1, j = strlen(B)-1;
    while(i>=0 || j>=0){
        int A_i = i>=0?A[i]-'0':0;	//将字符转换为数字,因为只有整数才能进行取余 
        int B_j = j>=0?B[j]-'0':0;
        if( count%2 == 0 )	//count从0开始,所以在这里表示奇数位 
            result[count++] = (A_i + B_j)%13;
        else
            result[count++] = (B_j - A_i + 10)%10;	//不管结果是否为正为负,+10取余一步到位 
        i--, j--;
    }
    for(int i=count-1; i>=0; i--)
        printf("%c", map[result[i]]);
}

在这里插入图片描述

解题思路二(参照算法笔记):
对两个整数AB采用字符串的方式读入,然后定义char数组ans来
记录加密的结果。为了让最低位从0号开始(方便两个数组对齐)
我们对两个字符串进行反转。反转完毕后,字符串的最低为就是
原整数的个位。
令len为AB长度的较大值,然后从低位开始遍历字符串,由于字符
串从0开始记录,因此如果当前位i是偶数,则对应题目中的奇数
进行相应的计算。
注意输出前需要把ans反转一下,因为此时字符串低位对应的是
整数的低位。
#include <stdio.h>
#include <string.h>
const int maxn=110;
char A[maxn],B[maxn],ans[maxn]={0};

//反转字符串 
void reverse(char s[])
{
	int len=strlen(s);
	for(int i=0;i<len/2;i++)
	{
		int temp=s[i];
		s[i]=s[len-1-i];
		s[len-1-i]=temp;
	}
} 

int main()
{
	scanf("%s %s",A,B);	//整数A和B
	reverse(A);	//将A和B反转
	reverse(B);
	
	int lenA=strlen(A);	//AB对应的长度
	int lenB=strlen(B);
	int len=lenA>lenB?lenA:lenB;	//AB较大的长度
	
	for(int i=0;i<len;i++)
	{
		int numA=i<lenA?A[i]-'0':0;
		int numB=i<lenB?B[i]-'0':0;
		if(i%2==0)
		{
			int temp=(numB+numA)%13;
			if(temp==10)
				ans[i]='J';
			else if(temp==11)
				ans[i]='Q';
			else if(temp==12)
				ans[i]='K';
			else
				ans[i]=temp+'0';
		}
		else
		{
			int temp=numB-numA;
			if(temp<0)
				temp+=10;
			ans[i]=temp+'0';
		}
	} 
	reverse(ans);	//反转结果字符串
	puts(ans); 
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值