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