2019年10月18日作业题解

讲真题目质量很低,各种莫名其面的细节,有的题目提交三四遍都过不了。。。。
口区。。。
顺便写个题解吧QWQ

A题2的多少次幂

Description
从键盘输入一个数x,x是2的整数次幂(x=2^y),请编程求出y的值。
Input
一个非负有理数x,x在[0,2^256]范围内。
Output
一个整数y。
Sample Input
1
Sample Output
0
标程
第一次TLE代码

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main(){
    double n;
    int i;
    scanf("%lf",&n);
    if(n==1){
        printf("0");
        return 0;
    }
    for(i=1;;++i){
        n/=2.0;
        if(n==1){
            printf("%d",i);
            return 0;
        }
    }
}

题目给的时限是1s。我的想法就是一直除以2统计除的次数就可以了,我试过从2到2的256次,完全不超时。。。。一直想不通。。。

AC代码

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main(){
    double n;
    double i;
    scanf("%lf",&n);
    i=log10(n)/log10(2);
    printf("%.0lf",i);
    return 0;
}

最后被X疯了,用了换底公式,换成以10为底的,这样运用C自带的函数就可以解决了,感觉速度快不了多少。。。
毕竟循环也就跑256次。。。

B题哪一行比较长

Description
读取两行字符串,按每行的长度从长到短输出。
Input
输入为两行,每行不会超过26个字符。
Output
输出为两行,按每行的长度从长到短输出。
Sample Input
abcdefghijk
abcdefghijklmnopqrstuvwxyz
Sample Output
abcdefghijklmnopqrstuvwxyz
abcdefghijk
标程

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

int main(){
    char a[100],b[100];
    gets(a);
    gets(b);
    int c,d;
    c=strlen(a),d=strlen(b);
    if(c>d){
        puts(a);
        printf("%s",b);
    }
    else{
        puts(b);
        printf("%s",a);
    }
    return 0;
}

题目用gets()函数读入一整行,题目说字符数不超过26,那么开一个100的数组,防止莫名其妙的数组越界。分别用两次gets()函数读入两串字符串,再运用strlen()函数可以算出字符串的长度,先输出长的就可。

C题24小时制转12小时制

Description
编写一个程序,把输入的24小时制的时间,转换12小时制的格式输出。

12小时制没有0点时段,是以数字12、1、2、3、4、5、6、7、8、9、10、11依次序表示每个时段的。
正午是“12:00 p.m.”,也就是24小时制的中午12点;
24小时制的12:00~12:59,是12小时制的12:00 p.m.~12:59 p.m.;
24小时制的13:00~23:59是十二小时制的1:00 p.m.~11:59 p.m.。
午夜是“12:00 a.m.”,也就是24小时制的0点,或者24点;
24小时制的00:00~00:59,是12小时制的12:00 a.m.~12:59 a.m.;
24小时制的1:00~11:59是十二小时制的1:00 a.m.~11:59 a.m.。
Input
输入为一行。输入为24小时制的小时和分,都占满2个字符的位置,用“:”分隔。范围是00:00~23:59。
Output
输出为12小时制的小时和分,都占满2个字符的位置,用“:”分隔,一个空格后跟“a.m.”(午前)或“p.m.”(午后)。
Sample Input
21:05
Sample Output
09:05 p.m.
标程

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

int main(){
    int a,b;
    scanf("%d:%d",&a,&b);
    if(a==12 && b==0){
        printf("12:00 p.m.");
        return 0;
    }
    if((a==0 && b==0) || (a==24 && b==0)){
        printf("12:00 a.m.");
        return 0;
    }
    if(a>12){
        a-=12;
        if(a<10){
            printf("0%d:",a);
        }
        else{
            printf("%d:",a);
        }
        if(b<10){
            printf("0%d p.m.",b);
        }
        else{
            printf("%d p.m.",b);
        }
        return 0;
    }
    else if(a<12){
        if(a==0){
            if(b<10){
                printf("12:0%d a.m.",b);
            }
            else{
                printf("12:%d a.m.",b);
            }
            return 0;
        }
        if(a<10){
            printf("0%d:",a);
        }
        else{
            printf("%d:",a);
        }
        if(b<10){
            printf("0%d a.m.",b);
        }
        else{
            printf("%d a.m.",b);
        }
        return 0;
    }
    else if(a==12){
        if(b<10){
            printf("12:0%d p.m.",b);
        }
        else{
            printf("12:%d p.m.",b);
        }
        return 0;
    }
    return 0;
}

在这里插入图片描述
这题简直令人窒息,我交了4次才AC,就是各种细节,各种判断,以及我不懂的12小时制
其实这题不难就是各种细节,仔细读题,把细节做好就很简单了。

D题产生等差序列 之一

Description
根据给出的初始数、公差和序列长度求等差序列。
Input
输入为一行,格式见sample。其中,start为初始数,step为公差,times为序列长度。满足,times>0,step不为0。
Output
把这个等差序列输出在一行里,序列两数之间用一个空格分隔。
Sample Input
start = 1, step = 2, times = 100
Sample Output
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199
标程

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

int main(){
    int start,step,times,i;
    scanf("start = %d, step = %d, times = %d",&start,&step,&times);
    for(i=1;i<times;++i){
        printf("%d ",start);
        start+=step;
    }
    printf("%d",start);
    return 0;
}

一道循环的板子题。
读入了首项,公差,n一个循环跑一边,边跑边输出就可以了。

E题产生等差序列 之二

Description
根据给出的初始数、公差和终止条件求等差序列。
Input
输入为一行,格式见sample。其中,start为初始数,step为公差,end为终止条件。满足,step不为0,并且start和end的大小关系与step的方向一致。end不一定是序列的最后一个数。start、step和end均为int类型的范围内的整数。
Output
把这个等差序列输出在一行里,序列两数之间用一个空格分隔。
Sample Input
start = 1, step = 2, end = 200
Sample Output
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199
标程

#include <stdio.h>

int main(){
    int start,step,end;
    scanf("start = %d, step = %d, end = %d",&start,&step,&end);
    printf("%d",start);
    if(step>0){
        for(start+=step;start<=end;start+=step){
			printf(" %d",start);
		}  
    }
    else{
        for(start+=step;start>=end;start+=step){
			printf(" %d",start);
		}
    }
    return 0;
}

与上一道题唯一的不同点就是这里的公差可负,这样带来的问题就是终止条件不同,其实分别判断公差和零的大小区别,之后分别给终止条件就可以了,公差大于零的情况,让终止数字小于等于终止条件;公差大于零的情况,让终止数字大于等于终止条件即可,就是多了这个步骤。

F题成绩的等级

Description
把百分制的考试成绩转换成五级制的成绩:
90~100:Excellent
80~89:Good
70~79:Average
60~69:Pass
0~59:Failing
不在0~100之间的输入是非法数据,输出“Error”。
Input
输入多行,每行一个整数。
Output
输入所对应的成绩等级。
Sample Input
-1
81
92
35
68
72
100
Sample Output
Error
Good
Excellent
Failing
Pass
Average
Excellent
标程

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

int main(){
    int n;
    while (scanf ("%d",&n)!=EOF){
        if (n==100){
			printf ("Excellent\n");
		}
        else if(n<0 || n>100){
			printf ("Error\n");
		}
        else{
			switch (n/10){
				case 9:printf ("Excellent\n");break;
        		case 8:printf ("Good\n");break;
        		case 7:printf ("Average\n");break;
        		case 6:printf ("Pass\n");break;
       			default:printf ("Failing\n");
       		}
		}
    }
    return 0;
}

课上讲的一道题,除以十判断输出就好了,再加上两个特判就行了。
我第一次用switch语句,觉得真难用。。。
不如if判断爽。。。

G题只有一个二元运算符的表达式运算

Description
编程序读入并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“”、“/”、“%”,与C语言的语法一致。
Input
每行输入一个表达式,格式为:二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。测试样例不存在除数为0的情况。
输入以a和b为0,且用一个空格分开结束。
Output
每行对应输入的运算符为“+”、“-”、“
”、“/”、“%”,则计算a+b、a-b、ab、a/b、a%b的值;否则输出“invalid op”。
Sample Input
33+5
8
9
2.2
1-6
17/3
9%3
0 0
Sample Output
38
72
invalid op
-5
5
0
标程

#include <stdio.h>

int main(){
    int a,b;
    char i;
    while(1){
    	scanf ("%d%c%d",&a,&i,&b);
    	if(a==0 && b==0 && i==32){
			break;
		}
    	else{
    		switch(i){
       			case '+':printf("%d\n",a+b);break;
        		case '-':printf("%d\n",a-b);break;
        		case '*':printf("%d\n",a*b);break;
        		case '/':printf("%d\n",a/b);break;
        		case '%':printf("%d\n",a%b);break;
        		default:printf("invalid op\n");
    		}
    	}
    }
}

和实验题很像,就是将输入数字,输入符号,输入数字,然后判断符号类型之后,俺要求输出就可。
再一次手贱用了switch,难用到bao。。。

H题求100以内的素数

Description
素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。
Input
输入为两个整数m和n,满足0<=m<=n<=100。
Output
从大到小输出m~n之间的所有素数,一个素数一行。如果m~n之间没有素数,则不输出任何数。
输出的所有数在两行“=====”之间。
标程

#include <stdio.h>

int main(){
    int m,n,i,j,k;
    scanf("%d%d",&m,&n);
    printf("=====\n");
    for(i=n;i>=m;i--){
        k=0;
        for(j=1;j<i;j++){
            if(i%j==0){
                k++;
            }
        }
        if(k==1){
            printf("%d\n",i);
        }
    }
     printf("=====");
}

这个用了最简单的筛选素数的方法,就是判断一个数字能否被比他小的数字整除,除了1和本身。
这样的时间复杂度显然很高可以达到O(n^2)当数据量很大时显然不满足。
其余的方法:打表,用根号降低复杂度(用处不大),线性筛素数(欧拉筛)等很多筛法,时间复杂度比这个低很多。

I题Sum Problem

Description
计算若干整数的和,这些整数都是小于1000的非负整数。
Input
输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。
Output
每组测试样例对应一行输出,输出所给的N个整数之和,顺序与输入对应。
Sample Input
3 1 2 3
5 10 15 20 30 50
Sample Output
6
125
标程

#include <stdio.h>
int main(){
    int i,n,flag=1;
    while(scanf("%d",&n)!=EOF){
        int sum=0;
        if(flag==1){
            flag=0;
        }
        else{
            printf("\n");
        }
        for(i=0;i<n;++i){
            int num;
            scanf("%d",&num);
            sum+=num;
        }
        printf("%d",sum);
    }
    return 0;
}

J题Sum Problem (II) : Input/Output Practice

Description
计算若干整数的和,这些整数都是小于1000的非负整数。
Input
输入的第一行是一个整数M,后面有M个测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。
Output
每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。
Sample Input
2
3 1 2 3
5 10 15 20 30 50
Sample Output
6
125
标程

#include <stdio.h>
int main(){
    int i,j,n,flag=1;
    int m;
    scanf("%d",&m);
    for(j=1;j<=m;++j){
        scanf("%d",&n);
        int sum=0;
        if(flag==1){
            flag=0;
        }
        else{
            printf("\n");
        }
        for(i=0;i<n;++i){
            int num;
            scanf("%d",&num);
            sum+=num;
        }
        printf("%d",sum);
    }
    return 0;
}

K题Sum Problem (III) : Input/Output Practice

Description
计算若干整数的和,这些整数都是小于1000的非负整数。
Input
输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。当输入的N为0时表示输入结束。
Output
每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。
Sample Input
3 1 2 3
5 10 15 20 30 50
0
Sample Output
6
125
标程

#include <stdio.h>
int main()
{
    int i,flag=1,n;
    while(1){
        scanf("%d",&n);
        if(n==0){
            break;
        }
        if(flag==1){
            flag=0;
        }
        else{
            printf("\n");
        }
        int sum=0,m;
        for(i=1;i<=n;++i){
            scanf("%d",&m);
            sum+=m;
        }
        printf("%d",sum);
    }
    return 0;
}

L题

Description
计算若干整数的和,这些整数都是小于1000的非负整数。
Input
输入的第一行是一个整数M,后面有M个测试用例。每个测试用例以一个整数N开始,后面接着是N个整数。
Output
每组测试用例对应一行输出,为所给的N个整数之和,顺序与输入对应。两样例的输出之间用一个空行分隔开。
Sample Input
2
3 1 2 3
5 10 15 20 30 50
Sample Output
6

125
标程

#include <stdio.h>
int main()
{
    int i,j,n,flag=1;
    int m;
    scanf("%d",&m);
    for(j=1;j<=m;++j){
        scanf("%d",&n);
        int sum=0;
        if(flag==1){
            flag=0;
        }
        else{
            printf("\n\n");
        }
        for(i=0;i<n;++i){
            int num;
            scanf("%d",&num);
            sum+=num;
        }
        printf("%d",sum);
    }
    return 0;
}

这几道题挺无聊的,就是换行怎么换,已经练过几次了。。。
之前也有说过解决方法,可以看看之前的博客,掌握了就会了。。。
无非就是这个多一行那个少一行。。

我的公众号开通啦!!!
欢迎大噶来踩踩:Lpy Now的小窝
欢迎大噶啊

发布了41 篇原创文章 · 获赞 58 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/a1351937368/article/details/102667848