这段C语言是什么意思呢?

2024-12-04 21:54:40
推荐回答(1个)
回答(1):

这是一个加密字符串的程序。

首先来分析这个程序的几个函数:

1.int gcd(int a ,int b);函数

    从函数名就能看出这个函数是用来计算a和b的最大公约数的。该函数计算最大公约数的方法很简单,就是穷举1到min(a,b)的数,找出最大的约数。如果楼主对求最大公约数感兴趣可以搜搜“辗转相除法”

2.int encrypt(int m,int k1,int k2);

    从函数名也能看出这个函数的用途,就是加密(encrypt)。该加密采用字符映射的方法,将m经过线性运算(a1*m+a2)的结果映射成0-26中的一个数字。%是取模运算,加密算法或HASH算法中最常用的非线性运算符,楼主感兴趣可以搜索“HASH”、“模运算”

3.main函数

    main函数的第一个for循环是初始化字符数组m和c的过程,将m和c中的内容都手动赋值为0。

    接下来是分别请求用户输入待加密字符串m和加密密钥key1和key2的语句,非常简单,不需多解释。

    在接下来的while循环语句是验证key1和key2是否满足加密要求,如果不满足则会要求用户再次输入key1和key2,直至满足要求为止。为什么要对key1和key2有要求呢?因为这个算法采用的是字符映射的方法加密,如果key1和key2都是26的倍数,那么该程序就相当于没有加密效果,举例说明,如果要加密的算法是某一个字符是w,根据加密函数可知w会被映射成下面这个东西:

    (w*key1+key2)%26 == (w*key1)%26 + key2%26  ==  w + 0  == w

所以说根本就没有加密效果。(虽然程序中未对key2进行检查,但key2的影响也是很大的)

最后一个for循环就是具体的加密过程,循环对字符串中的每一个字符进行加密,先用encrypt函数将字符串映射成0-26中的一个数字(很容易看出来这代表26个字母),然后再加上ASCII码'a'(即90),的到最后的结果。

以加密helloworld为例,密钥为123和321,结果看截图: