目录
二、有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中的英文大写字母、小写字母、数字、空格以及其他字符的个数
一、找出一个二维数组的鞍点
即该位置上的元素在该行上最大、在该列上最小,也可能没有鞍点。
- 先找出每行最大的值
- 再比较每行最大的值是否是该列最小的值
代码如下:
cpp
#include<stdio.h>
int main()
{
int arr[20][20];
int n,m;
scanf("%d %d",&n,&m);
int i,j,count=0,max;
int temp_i,temp_j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(i=0;i<n;i++)
{
max=arr[i][0];
for(j=0;j<m;j++)
{
if(max<arr[i][j])
{
max=arr[i][j];
temp_j=j;
}
}
//判断arr[i][temp_j]是否是arr[0][temp_j]...... arr[k][temp_j]中最小的
int flag=1;
int k;
for(k=0;k<n;k++)
{
if(arr[k][temp_j]<max)
{
flag=0;
break;
}
}
if(flag==1)
{
printf("坐标为(%d,%d)的值:%d是鞍点\n",i,temp_j,arr[i][temp_j]);
count++;
}
}
if(count==0)
{
printf("404not found\n");
}
return 0;
}
运行结果如下:
二、有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中的英文大写字母、小写字母、数字、空格以及其他字符的个数
代码如下:
cpp
#include<stdio.h>
int main()
{
char arr[3][80]={0};
int i,j;
int big_word=0,small_word=0,number=0,space=0,other=0;
for(i=0;i<3;i++)
{
gets(arr[i]);
}
for(i=0;i<3;i++)
{
for(j=0;arr[i][j]!='\0';j++)
{
if(arr[i][j]>='A'&&arr[i][j]<='Z')
{
big_word++;
}
else if(arr[i][j]>='a'&&arr[i][j]<='z')
{
small_word++;
}
else if(arr[i][j]==" ")
{
space++;
}
else if(arr[i][j]>='0'&&arr[i][j]<='9')
{
number++;
}
else
{
other++;
}
}
}
printf("大写字母:%d,小写字母:%d,数字:%d,空格:%d,其他字符:%d",big_word,small_word,number,space,other);
return 0;
}
测试用例:
??123
ABCnihao
>>
运行结果如下**(如果输入的是中文输入法下的其他字符,比如:?其他字符会记数为2)**:
三、有一行电文,已按下面规律编译成密码:A->Z,a->z,B->Y,b->y,即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程将密码译回原文,并输出密码和原文。
题目的关键在于解密 ,解密的表达式我们可以写为**'A' + (25 - (s[i] - 'A'))**
让我们分解这个表达式来理解它是如何工作的:
-
s[i] - 'A'
:这个子表达式计算当前字符s[i]
与大写字母 'A' 之间的ASCII码差值。因为ASCII码是连续的,并且 'A' 的ASCII码是65,所以如果s[i]
是 'B',那么s[i] - 'A'
的结果就是 1(因为 'B' 的ASCII码是66)。 -
25 - ...
:然后,从这个差值中减去 25。这是因为加密规则是将第i
个字母映射到第26-i+1
个字母。但是,由于我们已经通过s[i] - 'A'
得到了从 0 开始的索引(对于 'A' 是 0,'B' 是 1,依此类推),我们需要做的是找到这个索引对应的"反向"索引。由于字母表有 26 个字母,所以25 - (s[i] - 'A')
实际上是在计算从 'Z' 开始往回数的位置。 -
'A' + ...
:最后,我们将上一步的结果加上 'A' 的ASCII码。这是因为我们想要得到的是解密后的大写字母的ASCII码。由于我们已经计算出了从 'Z' 往回数的位置,加上 'A' 的ASCII码就会将我们带回到字母表的正确位置。
举个例子,如果 s[i]
是 'Z'(ASCII码为90),那么:
s[i] - 'A'
= 90 - 65 = 2525 - 25
= 0'A' + 0
= 'A'
所以,'Z' 被正确地解密回 'A'。
代码如下:
cpp
#include<stdio.h>
int main()
{
char s[100]={0};
gets(s);
printf("password is:%s\n", s);
int i;
while(s[i])
{
if(s[i]>='a'&&s[i]<='z')
{
s[i]='a' + (25 - (s[i] - 'a')) ;
}
else if(s[i]>='A'&&s[i]<='Z')
{
s[i]='A'+(25-(s[i]-'A') );
}
i++;
}
printf("original text is :%s",s);
return 0;
}
运行结果如下:
测试用例:
I am