跳转至

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;
}