PTA
数组
1.统计单词长度
#include <stdio.h>
int main()
{
char s[1000];
int flag=0;
while (scanf("%s",s)!=EOF)
{
printf("%d ",strlen(s));
flag=1;
if (getchar()=='\n')
break;
}
if (flag==0)
printf("0 ");
}
2.选择排序
int main()
{
int n,i,j,t;
int tmp,pos;
scanf("%d",&n);
int a[n];
for (i=0;i<n;i++)
scanf("%d",&a[i]);
for (i=0;i<n;i++)
{
pos=i;
tmp=a[i];
for (j=i+1;j<n;j++)
{
if (a[j]>tmp)
{
pos=j;
tmp=a[j];
}
}
a[pos]=a[i];
a[i]=tmp;
}
for (i=0;i<n;i++)
{
printf("%d",a[i]);
if (i!=n-1)
printf(" ");
}
}
3.交换最大值和最小值
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
int main()
{
int n,i,j,t;
int max=-1,min=10000;
int pos1,pos2;
scanf("%d",&n);
int a[n];
for (i=0;i<n;i++)
scanf("%d",&a[i]);
for (i=0;i<n;i++)
{
if (a[i]>max)
{
max=a[i];
pos1=i;
}
if (a[i]<min)
{
min=a[i];
pos2=i;
}
}
a[pos1]=a[n-1];
a[n-1]=max;
if (pos2==n-1) #最小值下标在最后一个时要特别考虑
pos2=pos1;
a[pos2]=a[0];
a[0]=min;
for (i=0;i<n;i++)
{
printf("%d ",a[i]);
}
}
4.找出不是两个数组共有的元素
给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
输出格式:
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
#include <stdio.h>
int main()
{
int n1,n2;
int i,j,k=0,l;
scanf("%d",&n1);
int a[n1];
for (i=0;i<n1;i++)
scanf("%d",&a[i]);
scanf("%d",&n2);
int b[n2];
int flag1=1;
int c[n1+n2];
for (i=0;i<n2;i++)
scanf("%d",&b[i]);
for (i=0;i<n1;i++)
{
for (j=0;j<n2;j++)
{
if (b[j]==a[i])
{
flag1=0;
break;
}
}
if (flag1)
{
c[k]=a[i];
k++;
}
flag1=1;
}
for (i=0;i<n2;i++)
{
for (j=0;j<n1;j++)
{
if (b[i]==a[j])
{
flag1=0;
break;
}
}
if (flag1)
{
c[k]=b[i];
k++;
}
flag1=1;
}
for(i=0;i<k;i++){
for(j=i+1;j<k;j++){
if (c[j]==c[i]){
for (l=j;l<k;l++){
c[l]=c[l+1];
}
k--;
}
}
}
for(i=0;i<k;i++){
printf("%d",c[i]);
if(i<k-1)
printf(" ");
}
}
5.凯撒密码
为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
输入格式:
输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。
输出格式:
输出加密后的结果字符串。
#include <stdio.h>
int main()
{
char s[1000];
int i,k=0;
char c;
while ((c=getchar())!='\n'){
s[k]=c;
k++;
}
int offset;
scanf("%d",&offset);
for (i=0;i<k;i++){
if (s[i]>='A' && s[i]<='Z')
if (offset>0)
s[i]=(s[i]+offset%26-'A')%26+'A';
else{
while (offset<0)
offset+=26;
s[i]=(s[i]+offset%26-'A')%26+'A';
}
else if (s[i]>='a' && s[i]<='z'){
if (offset>0)
s[i]=(s[i]+offset%26-'a')%26+'a';
else{
while (offset<0) #C语言中-1%26=-1
offset+=26;
s[i]=(s[i]+offset%26-'a')%26+'a';
}
}
}
for (i=0;i<k;i++){
printf("%c",s[i]);
}
}
6.字符串转十进制数
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
#include <stdio.h>
int main()
{
char c;
int flag=0;
int sign;
int res=0;
while ((c=getchar())!='#')
{
if (flag==0){
if (c=='+')
sign=1;
else if (c=='-')
sign=-1;
}
if (c>='0' && c<='9' || c>='a' && c<='f' || c>='A' && c<='F'){
flag=1;
if (c>='0' && c<='9'){
res=res*16+(c-'0');
}else if (c>='a' && c<='f'){
res=res*16+c-'a'+10;
}else if (c>='A' && c<='F'){
res=res*16+c-'A'+10;
}
}
}
res*=sign;
printf("%d",res);
}
7.删除重复字符
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
#include <stdio.h>
int main()
{
char s[100];
char c;
int i,j,k=0,l;
char t;
while ((c=getchar())!='\n'){
s[k]=c;
k++;
}
for (i=0;i<k;i++){
for (j=i+1;j<k;j++){
if (s[i]==s[j]){
for (l=j;l<k;l++){
s[l]=s[l+1];
}
k--;
j--; /*这一步需要注意,很容易忽略,处理完要删除的字符,要重新处理该元素*/
}
}
}
for (i=0;i<k;i++){
for (j=k-1;j>i;j--){
if (s[j]<s[j-1]){
t=s[j-1];
s[j-1]=s[j];
s[j]=t;
}
}
}
for (i=0;i<k;i++){
printf("%c",s[i]);
}
}
8.首字母大写
本题目要求编写程序,输入一行字符,将每个单词的首字母改为大写后输出。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出已输入的字符,其中所有单词的首字母已改为大写。
#include <stdio.h>
int main()
{
int flag=1;
char c;
while((c=getchar())!= '\n')
{
if (c==' ')
flag = 1;
else if (flag==1)
{
flag=0;
if (c>='a' && c<='z')
c-=32;
}
putchar(c);
}
return 0;
}