pta题目练习题(三)下 - 实践
L1-017 到底有多二
分数 15
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。
输入格式:
输入第一行给出一个不超过50位的整数N。
输出格式:
在一行中输出N犯二的程度,保留小数点后两位。
输入样例:
-13142223336
输出样例:
81.82%
解题方法:
本题是一个字符串题,其实15分的题,如果题目没有写计算,它应该都是字符串题。
一,使用string数组,储存输入。
char n[MAX];
scanf("%s",n);
二,判断负数与偶数。
注意n是字符串,在计算偶数时,要注意类型的转换。
int is_negative = 0; // 是否负数
int is_even = 0; // 是否偶数
//标记负数
if(n[0]=='-'){
is_negative=1;
size=size-1;
}
//标记偶数
if((n[strlen(n)-1]-'0')%2==0){
is_even=1;
}
三,计算数字数与2的数量。
使用strlen我们可以直接得到数字数,对于2的数量循环判断就好。
int size=strlen(n); // 总位数
//统计位数和数字2的个数
int frist=0;
if(is_negative==1){
frist=1;
}
for(int i=frist;i
四,完整代码:
#include
#include
#define MAX 100
int main(){
char n[MAX];
scanf("%s",n);
int size=strlen(n); // 总位数
int count_two = 0; // 数字2的个数
int is_negative = 0; // 是否负数
int is_even = 0; // 是否偶数
//标记负数
if(n[0]=='-'){
is_negative=1;
size=size-1;
}
//标记偶数
if((n[strlen(n)-1]-'0')%2==0){
is_even=1;
}
//统计位数和数字2的个数
int frist=0;
if(is_negative==1){
frist=1;
}
for(int i=frist;i
L1-018 大笨钟
分数 10
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。
下面就请你写个程序,根据当前时间替大笨钟敲钟。
输入格式:
输入第一行按照hh:mm的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。
输出格式:
根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。如果不是敲钟期,则输出:
Only hh:mm. Too early to Dang.
其中hh:mm是输入的时间。
输入样例1:
19:05
输出样例1:
DangDangDangDangDangDangDangDang
输入样例2:
07:05
输出样例2:
Only 07:05. Too early to Dang.
解题方法
字符串题,注意类型转换。
#include
#include
#define MAX 100
int main(){
char time[MAX];
scanf("%s",&time);
int hh,mm;
hh=(time[0]-'0')*10+(time[1]-'0');
mm=(time[3]-'0')*10+(time[4]-'0');
if(mm>0){
hh=hh+1;
}
// printf("%d\n",hh);
if(hh>=0&&hh<=12){
printf("Only %s. Too early to Dang.",time);
}
else{
hh=hh-12;
for(int i=0;i
L1-019 谁先倒
分数 15
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
输入格式:
输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(≤100),随后N行,每行给出一轮划拳的记录,格式为:
甲喊 甲划 乙喊 乙划
其中喊是喊出的数字,划是划出的数字,均为不超过100的正整数(两只手一起划)。
输出格式:
在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。
输入样例:
1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
输出样例:
A
1
解题方法:
#include
struct fgg{
int a_han;
int a_huo;
int b_han;
int b_huo;
};
int rps(int a_1,int a_2,int b_1,int b_2){
int sum=a_1+b_1;
int tmp=0;
if(a_2==sum&&b_2!=sum){
tmp=1;
}
else if(a_2!=sum&&b_2==sum){
tmp=2;
}
return tmp;
}
int main(){
int a,b;
struct fgg f;
scanf("%d %d",&a,&b);
//a,b是酒量(最多能喝多少杯不倒),实际可以喝的酒是加一。
a=a+1;
b=b+1;
int A,B;
A=a;
B=b;
int n;
scanf("%d",&n);
for(int i=0;i < n && a > 0 && b > 0;i++){
scanf("%d %d %d %d",&f.a_han,&f.a_huo,&f.b_han,&f.b_huo);
int tmp;
tmp=rps(f.a_han,f.a_huo,f.b_han,f.b_huo);
if(tmp==1){
a--;
}else if(tmp==2){
b--;
}
}
if(a==0){
printf("A\n");
printf("%d\n",B-b);
}else if(b==0){
printf("B\n");
printf("%d\n",A-a);
}
return 0;
}
浙公网安备 33010602011771号