int main(int argc, char *argv[])
{
int i,j,k,n
printf("请输入需要打印的图形的行数:")
scanf("%d",&n)
if(n%2==0) /*分成上下两部分,输入数值n/2 */
n=n/2
else
n=n/2+1
for (i=1i<=ni++) /*输出上半三角形 */
{
for (j=nj>ij--)
printf(" ")
for (k=0k<2*i-1k++)
printf("*")
printf("\n")
}
/* 输出下半三角形*/
for (i=n-1i>0i--)
{
for (j=nj>ij--)
printf(" ")
for (k=0k<2*i-1k++)
printf("*")
printf("\n")
这是一个加密字符串的程序。
首先来分析这个程序的几个函数:
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,结果看截图: