凯撒密码问题再遇?
/**********************************************************
Caesar Password
Time Limit: 1000MS Memory Limit: 65535KB
Submissions: 565 Accepted: 194
Description恺撒大帝是古罗马共和国末期著名的统帅和政治家。虽然他一生从未登上过皇位,但是直到今天在西方国家,他的名字仍是君主的代名词。他博学多才、文武双全,既是卓越的军事家又是雄辩的文学家。而恺撒密码正是这位伟大的君主发明的。话说在恺撒大帝出征时,为了避免军令落入敌军手中而泄漏军情,他自己发明了一种单字替代密码。所谓“单字替代密码”就是把明文中的每个字母用密文中的对应字母替代,明文字符集与密文字符集是 一一对应的关系。而恺撒密码就属于一种简化的单字替换密码。恺撒密码,又叫恺撒移位密码,它是将字母表中的字母依次后移一定的位置得到的,例如后移3位:
明码表:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密码表:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
所以后移5位的时候:
明文 F O R E S T
密文 K T W J X Y
其实恺撒密码挺容易被破解...因为就那么26种...虽然这么简单,但还是有着很大的用初,现在需要你写一个程序能够对任意移位K(K大于0表示向后移位,小于0表示向前移位),下的明文进行加密。
Input输入的第一行为小于100的正整数 n ,代表计算的数据组个数。然后是 n 组数据输入, 每一组输入包括2行, 第1行是 K 值, -26< K < 26;第2行是明文串,其长度不超过 100 个字符(包含26个大小写字符,不包含空格)。
Output输出其密文
Sample Input
2
3
itisapen
17
Helloworld
Sample Output
lwlvdshq
Yvccfnficu
*************************************************************/
经典的凯撒密码 移位问题
我的程序出现问题,很想知道错在哪儿;
/*******************************
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char strx[50][100], stry[50][100]; /*字符数组strx是储存输入的字符串, stry是储存移位后的字符串*/
int fig[100], num, x, y, sum = 26, k;
scanf( "%d", &num ) ;
for (x = 0; x < num; x++ )
{
scanf ("%d" , &fig[x] ) ;
fflush(stdin);
gets (strx[x]) ;
}
for (x = 0; x < num; x++ )
{
for (y = 0; strx[x][y] != '\0'; y++ )
{
if ( strx[x][y] >= 'A' && strx[x][y] <= 'Z')/*判断是否为大写字母*/
{
stry[x][y] = strx[x][y] + fig[x];
if (fig[x] < 0 && stry[x][y] < 'A') /* k<0的情况*//*循环移位*/
stry[x][y] = strx[x][y] + sum + fig[x];
else if (fig[x] > 0 && stry[x][y] > 'Z')
stry[x][y] = strx[x][y] - sum + fig[x];
}
else if (strx[x][y] >= 'a' && strx[x][y] <= 'z' )/*判断是否为小写字母*/
{
stry[x][y] = strx[x][y] + fig[x];
if (fig[x] < 0 && stry[x][y] < 'a' ) /* k<0的情况*//*循环移位*/
stry[x][y] = strx[x][y] + sum + fig[x];
else if (fig[x] > 0 && stry[x][y] > 'z')
stry[x][y] = strx[x][y] - sum + fig[x];
}
}
stry[x][y] = '\0' ;
}
for ( x = 0 ; x < num ; x++ )
{
puts (stry[x]) ;
}
return 0 ;
}
******************************/
我的输出:
2
3
itisapen
17
Helloworld
lwlvdshq
Yvcc€垁僣u
Press any key to continue
第一行是对的;
问题就是在第二行输出时有两个汉字,后经调试
发现遇到'o'时,移位后ASC||本应该为 111 + 17 = 128, 但是调试发现此时ASC||为 -128;
接着的字符也错,这是为什么呢?
希望得到大家的帮忙, 谢谢!