SCAU高程进阶题(自用)

发布于:2025-02-11 ⋅ 阅读:(97) ⋅ 点赞:(0)

18711 字符串去重

Description
一个完全由小写字母组成的长度为n的字符串,现在要求你去除所有重复的字母,并将剩下的字母按从小到大的次序输出。
如输入baaadccaab,输出abcd。

输入格式
第一行一个整数n,表示字符串长度(0<=n<=100000)。
第二行一个字符串。

输出格式
去除所有重复的字母,并将剩下的字母按ASCII码从小到大的次序输出。

输入样例
10
baaadccaab

输出样例
abcd

#include <stdio.h>
#include <string.h>

int main()
{
    int n;
    scanf("%d",&n);
    char ch[n],ans[26];
    //getchar()和gets(s)连用,为了消除前一个输入的回车导致gets(s)无法输入的问题
    getchar();
    gets(ch);
    long len = strlen(ch);
    for(int i=0;i<len;i++){
        ans[ch[i]-'a']=ch[i];
    }
    for(int i=0;i<len;i++){
        if(ans[i]!='\0')
            printf("%c",ans[i]);
    }
    return 0;
}

18410 最后一张纸片


有N张(N不超过1000)纸片,每张纸片上有一个数字从1至N,最初N张纸片按由大到小顺序叠放(编号最大的在最下面),现在不断重复执行如下操作:
(1)将最上面的一张放到最下面;
(2)再将最上面的一张放到最下面;
(3)将当前最上面的一张拿走;
重复上面操作(1)(2)(3)(1)(2)(3)(1)......
直到剩下最后一张纸片,输出该纸片上的编号
输入格式
一个正整数N
输出格式
剩下的最后一张纸片编号
输入样例
3
输出样例
2
提示:N=3时,每列表示一次操作后的纸片排列情况
1 2 3 1 2 1 2
2 3 1 2 1 2
3 1 2
 

#include <stdio.h>
#include <string.h>

int main()
{
    int n;
    scanf("%d",&n);
    int arr[n],s=n;
    //倒序输入
    for(int i=0;i<n;i++){
        arr[i]=s;
        s--;
    }
    //每次遍历都将要抽出的那一张放到数组的末尾
    //最终剩下的那一张就是数组第一个元素
    for(int i=n-1;i>0;i--){
        //先把第一个放到最后
        for(int j=i;j>0;j--){
            int temp=arr[j];
            arr[j]=arr[j-1];
            arr[j-1]=temp;
        }
        //再把第二个放到最后(重复上述代码)
        for(int j=i;j>0;j--){
            int temp=arr[j];
            arr[j]=arr[j-1];
            arr[j-1]=temp;
        }
        //将最上面那一张拿走
        arr[i]='\0';
    }
    printf("%d",arr[0]);
    return 0;
}

不要bad

Description
由键盘输入一行字符(最多不超过80个字符,以回车结束),要求编程实现删除该行字符中的“bad”(小写),输出处理后的结果(结果不含bad)。

输入格式
一行字符

输出格式
不含“bad”的结果

输入样例
abadnewsisgoodnews,andbadisnotBad

输出样例
anewsisgoodnews,andisnotBad
注意特殊情况例如:ababadde

#include <stdio.h>
#include <string.h>

int main()
{
    char ch[81];
    gets(ch);
    int len=strlen(ch);
    for(int i=0;i<len-3;i++){
        //将bad位置置为空
        if(ch[i]=='b' && ch[i+1]=='a' && ch[i+2]=='d'){
            ch[i]='\0';
            ch[i+1]='\0';
            ch[i+2]='\0';
            //将后续元素向前补齐
            for(int j=0;i+j+3<len;j++){
                ch[i+j]=ch[i+3+j];
                ch[i+3+j]='\0';
            }
            //从头检测
            i=-1;
        }

    }
    for(int i=0;i<len;i++){
            printf("%c",ch[i]);
    }
    return 0;
}

分解质因数

读入一个数n,输出1到n所有数分解成质因数之积的形式,格式见参考样式

Such us: n=10;

输出:

1=1

2=2

3=3

4=2*2

5=5

6=2*3

7=7

8=2*2*2

9=3*3

10=2*5

一个数除以从2开始的循环,如果==1,结束,!=1,继续循环

#include <stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    printf("1=1\n");
    for(int i=2;i<=n;i++){
        printf("%d=",i);
        int k=i;
        for(int j=2;j<=n;j++){
            int flag=0;
            if(k%j==0){
                printf("%d",j);
                k/=j;
                flag=1;
                j=1;
            }
            if(k==1){
                break;
            }else if(flag==1){
                printf("*");
            }

        }
        printf("\n");
    }
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到