今天我们来学习一下有关字符和数字的混合运算的处理方法。
用题说话:
问题 A: 字符串解密
题目描述
现让A、a代表数字0,B、b代表数字1,C、c代表数字2,……Z、z代表数字25。
输入k、b和字符串,请你将字符串中的字母逐一按照y=(kx + b)的规则解密,其中x为字母代表的数字,如果y超过25,则将y对26取余。
输入
测试数据有多组,每组输入两行:
第一行:输入 k b (含义如上)(k>0, b >= 0)
第二行:输入待解密的字符串(长度不超过5000)
输出
每组测试输出一行
第一行:解密后的字符串
样例输入
1 4
E hkra OVQ!
2 46
YQY (:з」∠)…
样例输出
I love SZU!
QAQ (:з」∠)…
这道题的解题算法不难,只要编写一个函数让输入的每一个字符都按相应的规则转化输出就好,关键点在于转化函数的编写。
#include<stdio.h>
#include<string.h>
char zhuanhuan(char a,int k,int b);
int main()
{
int k,b;
char arr[500]={
'\0'};
while(scanf("%d%d",&k,&b)!=EOF)
{
getchar();
gets(arr);
/*要有多组数据的EOF,输入又有数字和字符,还要吃掉空格
建议可以使用这样的分行输入,在第一行设置EOF而不是想着
怎么在while条件里一次性输入*/
for(int i=0;i<strlen(arr);i++)
{
printf("%c",zhuanhuan(arr[i],k,b));
}
printf("\n");
}
return 0;
}
char zhuanhuan(char a,int k,int b)
{
if(a>='a'&&a<='z')
{
/*这里是今天的重点*/
/*其实字符型数据可以形象理解成ASCII+‘\0’(NULL)
NULL是ASCII里的第一个*/
a-='a';
/*一个字符型数据减去一个字符型剩下的就是整型数了。就可以愉快的加减取余啦*/
a=(k*a+b);
if(a>25)
{
a=a%26;
}
a=a+'a';
return a;
}
else if(a>='A'&&a<='Z')
{
a-='A';
a=(k*a+b);
if(a>25)
{
a=a%26;
}
a=a+'A';
return a;
}
else
{
return a;
}
}
哈哈哈如果你简单的复制粘贴我的代码你过后就会发现自己只错误50%
if(a>='a'&&a<='z')
{
/*a是char内存只占有一个字节,(int)a最大只有128*/
a-='a';
a=(k*a+b);
/*而当你做k*a+b时其实很容易就会溢出的这时候有些数据就无法正常表达了
我们最好按下面的代码先定义一个整型数c,让c来表达减‘a’后的数字就可以解决这个问题了 */
if(a>25)
{
a=a%26;
}
a=a+'a';
return a;
}
if(a>='a'&&a<='z')
{
int c;
c=a-'a';
c=(k*c+b);
if(c>25)
{
c=c%26;
}
a=c+'a';
return a;
}