PAT之017 011 023 032

L1-017 到底有多二

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。

输入格式:

输入第一行给出一个不超过50位的整数N

输出格式:

在一行中输出N犯二的程度,保留小数点后两位。

代码 

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

int main()
{
    double er=1.0;
    char a[55];
    scanf("%s",a);
    int i,count = 0;
    for(i=0;i<strlen(a);i++)
    {
        if(a[i]=='2')//使用字符'2'
            count++;
    }
    int u = strlen(a);
    if(a[0]=='-')
    {
        er = er*1.5;
        u--;
        if(a[u]%2==0)
            er*=2.0;
    }
    else{
        if(a[u-1]%2==0)//判断正负对下标影响
            er*=2.0;
    }
    er = 100*er*count/u;
    printf("%.2lf\%\n",er);
        
    
    return 0;
    
}

L1-011 A-B

输入格式:

输入在2行中先后给出字符串A和B。两字符串的长度都不超过10^4,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:

在一行中打印出A−B的结果字符串。

输入样例:

I love GPLT!  It's a fun game!
aeiou

输出样例:

I lv GPLT!  It's  fn gm!

代码 

考虑到直接在a字符串内修改还要移动之后的字符,因而利用循环将a中不满足b的字符赋给另一个字符串c,此时难点就是判断是否满足条件

#include<stdio.h>
#include<string.h>
int main(){
    char a[10003],b[10003],c[10003];
    int i,j;
    int flag=1,k=0;
    fgets(a,10003,stdin);
    fgets(b,10003,stdin);
    for(i=0;i<strlen(a);i++){
        flag=1;//不用删去
        for(j=0;j<strlen(b);j++){
            if(a[i]==b[j])
                flag=0;
            }
            if(flag){
                c[k++]=a[i];
            }
    }
    c[k]='\0';//给c一个结束
    for(i=0;c[i]!='\0';i++){
        printf("%c",c[i]);
    }
    printf("\n");
    return 0;
}

 L1-023 输出GPLT

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。

输入格式:

输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。

输出格式:

在一行中按题目要求输出排序后的字符串。题目保证输出非空。

输入样例:

pcTclnGloRgLrtLhgljkLhGFauPewSKgt

输出样例:

GPLTGPLTGLTGLGLL

代码 

GPLT顺序输出,等到剩下单个时依然如此,因而要先计数四种各自的个数,然后顺序判断是否大于等于1

#include<stdio.h>
int main(){
    char s[10000];
    char a[4]={"GPLT"};
    scanf("%s",s);
    int g=0,p=0,l=0,t=0;
    for(int i=0;i<strlen(s);i++){
        if(s[i]>='a'&&s[i]<='z')
            s[i]-=32;
        if(s[i]=='G')
            g++;
        else if(s[i]=='P')
            p++;
        else if(s[i]=='L')
            l++;
        else if(s[i]=='T')
            t++;
    }
    while(g>0||p>0||l>0||t>0)
    {
        
        if(g>0){
            printf("G");
            g--;
        }
        if(p>0){
        printf("P");
        p--;
        }
        if(l>0){
            printf("L");
            l--;
        }
        if(t>0){
            printf("T");
            t--;
        }
    }
    printf("\n");
    return 0;
}

 L1-032 Left-pad

在字符串前填充一些东西到一定的长度。例如用*去填充字符串GPLT,使之长度为10,调用left-pad的结果就应该是******GPLT

输入格式:

输入在第一行给出一个正整数N(≤10^4)和一个字符,分别是填充结果字符串的长度和用于填充的字符,中间以1个空格分开。第二行给出原始的非空字符串,以回车结束。

输出格式:

在一行中输出结果字符串。

输入样例1:

15 _
I love GPLT

输出样例1:

____I love GPLT

输入样例2:

4 *
this is a sample for cut

输出样例2:

 cut

注意到输入字符个数与给出填充的大小关系不同时,输出的顺序不同 

初始化s的长度太大了,一直用的10000,一直是18分,太坑了(

#include<stdio.h>
#include<string.h>
int main(){
    long int n;
    char ch;
    char s[100000];
    scanf("%ld %c",&n,&ch);
    getchar();//因为需要回车,而fgets在接收\n后就
    fgets(s,100000,stdin);//结束吸收字符,因而需要一个getchar吸收回车
    int l=strlen(s)-1;   //在结束输入字符时需要回车结束,
                        // 而fgets接收\n使得长度+1,因而需要把长度-1才是需要的长度
    if(l<n){
        for(int i=0;i<n-l;i++){
            printf("%c",ch);
        }
        for(int i=0;i<l;i++){
            printf("%c",s[i]);
        }
        printf("\n");
    }

    if(l>=n){
        for(int i=l-n;i<l;i++){
            printf("%c",s[i]);
        }
        printf("\n");
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值