1.有一组均由字符A~Z和a~z组成的字符串,其中要求将字符串中各字符按如下要求进行转换: Az、By、Cx、...... 、Xc、Yb、Za
输入: 第一行输入字符串(长度<=10000)
输出: 输出转换之后的字符串。
输入样例1:
输出样例2:
输入样例2:
输出样例2:
代码如下
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[]) {
char *a = (char*)malloc(10000);/*定义字符串*/
scanf("%s", &*a); /*输入字符串*/
for (int i = 0; a[i] != '\0'; i++) {
if (a[i] >= 'A' && a[i] <= 'Z') /*如果是大写字母,先转成对于小写字母,再根据转换规则转换*/
a[i] = a[i] + 32 + 25 - (a[i] - 'A') * 2; /*例如'B','B'+32变成'b',加25变成'z'+2,再减去('B'-'A')*2就变成'Y'*/
else if (a[i] >= 'a' && a[i] <= 'z') /*小写字母转大写字母方式同上*/
a[i] = a[i] - 32 + 25 - (a[i] - 'a') * 2; /*例如'b','b'-32变成'B',加25变成'Z'+2,再减去('b'-'a')*2就变成'y'*/
}
for (int i = 0; a[i] != '\0'; i++) { /*打印输出*/
printf("%c", a[i]);
}
}
2.现要对一个由字符a-z和A-Z组成的字符串进行解密,已知加密规则是: 字符串中所有字符分别在大写或小写的字母表中被循环左移5位(fGh-->aBc)
输入: 一个加密过的字符串(( 长度大于1 且小于50 且只包含大小写字母)。 )
输出: 输出解密后的字符串
样例输入:
样例输出:
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[]) {
char *a = (char*)malloc(50);/*定义字符串*/
scanf("%s", &*a); /*输入字符串*/
for (int i = 0; a[i] != '\0'; i++) {
if(a[i]<'A'||(a[i]>'Z'&&a[i]<'a')||a[i]>'z'){/*判断字符串是否有无*/
printf("输入字符有误:应输入只包含大、小写英文字符的字符串!");
break;
}
if((a[i]-'A'>=5&&a[i]>='A'&&a[i]<='Z')||(a[i]-'a'>=5&&a[i]>='a'&&a[i]<='z'))/*判断字符串变换是否进入变换循环*/
a[i]-=5;/*若不进入变换循环则直接变换5次*/
else if(a[i]>='A'&&a[i]<='Z')/*若大写英文字符进入变换循环则变换成'A'*/
a[i]='Z'-(4-(a[i]-'A'));/*再变换成'Z',从'Z'变换,变换4-(变换成'A'所用次数)次*/
else if(a[i]>='a'&&a[i]<='z')/*小写英文字符变换同上*/
a[i]='z'-(4-(a[i]-'a'));
}
for (int i = 0; a[i] != '\0'; i++) { /*打印输出*/
printf("%c", a[i]);
}
}
3.输入一行由字符a~z和A~Z组成的字符串,字符串长度<=10000,求其中任意两个字符大小写一共出现的次数的差值的绝对值
输入:第一行输入字符串
第二行输入两个字符。
输出:输出这两个字符出现次数的差值的绝对值
样例输入:
样例输出:
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[]) {
char *a = (char*)malloc(10000);/*定义字符串*/
char b,c;
int n=0,m=0;
scanf("%s", &*a); /*输入字符串*/
scanf("%c %c", &b,&c);
for (int i = 0; a[i] != '\0'; i++) {
if(a[i]==b||a[i]+32==b||a[i]-32==b)n++;/*统计输入字符的大小写一共出现的次数*/
if(a[i]==c||a[i]+32==c||a[i]-32==c)m++;
}
printf("%d",abs(n-m));/*输出出现次数的差值的绝对值*/
}
4.输入正整数A、B、C(0<=A,B,C<=10000),若用'+'、'-'、'*'、'/'、'%'之一组成等式(即A@B=C,@是上述运算符之一,),则输出“YES”,否则输出“NO”;
输入:
第一行输入正整数N(1<=N<=1000)表示有N组数据,
其后有N行非零整数A、B、C。
输出:
对于每行整数A、B、C,其计算结果各占一行。
输入样例:
输出样例:
(说明:输入样例中2*3=6,5/3=1,1%4=1)
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[]) {
int N,a,b,c,k=0;
char *m = (char*)malloc(1000);/*定义一个字符串用来存放输出结果*/
scanf("%d", &N);
for (int i = 0; i<N; i++) {
scanf("%d %d %d", &a,&b,&c);/*输入三个数*/
if(a+b==c||a-b==c||a*b==c||a/b==c||a%b==c){/*判断四则运算是否符合*/
m[k]='Y';k++;m[k]='E';k++;m[k]='S';k++;
}
else {
m[k]='N';k++;m[k]='O';k++;
}
}
for(int i=0;m[i]!='\0';i++){/*按位输出*/
printf("%c",m[i]);
if(m[i]=='S'||m[i]=='O')
printf("\n");
}
}
5.Excel表列名称由字母A~Z组成,列字母的规律如下:
A、B、C.....Z、AA、AB......AZ、BA、BB.......ZZZZY、ZZZZZ.......
输入:输入包含两个列名称字符串,长度均小于等于5。
输出:输出两个列名称之间共有多少列
输入样例:
输出样例:
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[]) {
char *a = (char*)malloc(1000);
char *b = (char*)malloc(1000);/*定义两个字符串用来存放列数*/
int n = 0, m = 0, x = 0, y = 0; /*n,m分别存放输入的列有几层,x用来统计列数*/
scanf("%s", &*a);
scanf("%s", &*b);
for (int i = 0; a[i] != '\0'; i++) {
n++; /*例如输入”AA“,即n=2*/
}
for (int i = 0; b[i] != '\0'; i++) {
m++;
}
for (int i = n - 2, j = 1; i >= 0; i--, j++) {
x += (a[i] - 'A' + 1) * pow(26, j);
}/*计算每个字符串的总列数,因为c语言中一个数0次方为0故不计算最后一层,即“DA”只计算“(A-D)A”*/
x += a[n - 1] - 'A' + 1; /*单独计算最后一层即"AZ"只计算"A-Z"*/
for (int i = m - 2, j = 1; i >= 0; i--, j++) { /*同上*/
y += (b[i] - 'A' + 1) * pow(26, j);
}
y += b[m - 1] - 'A' + 1;
printf("%d", abs(x - y) - 1); /*打印输出*/
}
总结
C语言中字符串的操作可以使用指针进行编写,相比于字符数组更为方便简洁。
在进行英文字符转换时,要注意字符的大小写,对照ASCII表进行有规律的转换
C语言中的次方函数POW,一个数的0次方,在程序中为0,应注意