本人双非计算机专硕研一在读,由于导师放养,开始放飞自我。。。野蛮生长。。。早早开始刷题,为找工作做准备~
3.1简单模拟
模拟题是一类"题目怎么说,你就怎么做"的题目。这类题目不涉及算法,完全只是根据题目描述来进行代码的编写,考查的是代码能力。
卡拉兹(Callatz)猜想:
对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 ( 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (,以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
输入格式:
每个测试输入包含 1 个测试用例,即给出正整数 n 的值。
输出格式:
输出从 n 计算到 1 需要的步数。
输入样例:
3
输出样例:
5
#includeint main(){ int n,step = 0; scanf("%d",&n); while(n!=1){ if(n %2 ==0) n = n/2; else n=(3*n+1)/2; step++; } printf("%d\n",step); return 0; }
PAT B1032
为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。
输入格式:
输入在第 1 行给出不超过 1 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。
输出格式:
在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。
输入样例:
6
3 65
2 80
1 100
2 70
3 40
3 0
输出样例:
2 150
#includeint main(){ int n; int maxn = 100010; int school[maxn] = {0}; int schid,mark; scanf("%d",&n); for(int i=0;i ){ scanf("%d%d",&schid,&mark); school[schid] += mark; } int maxid,MAX=-1; for(int i=1;i<=n;i++){ if(school[i]>MAX){ MAX = school[i]; maxid = i; } } printf("%d %d",maxid,MAX); return 0; }
B1011 A+B和C
给定区间 [−] 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C。
输入格式:
输入第 1 行给出正整数 T (≤),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。
输出格式:
对每组测试用例,在一行中输出 Case #X: true
如果 A+B>C,否则输出 Case #X: false
,其中 X
是测试用例的编号(从 1 开始)。
输入样例:
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647
输出样例:
Case #1: false
Case #2: true
Case #3: true
Case #4: false
#includeint main(){ int T,tcase = 1; scanf("%d",&T); long long a,b,c; while(T--){ scanf("%lld%lld%lld",&a,&b,&c); if(a+b>c){ printf("Case #%d: true\n",tcase++); }else{ printf("Case #%d: false\n",tcase++); } } return 0; }
B1016 部分A+B
正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA 组成的新整数 PA。例如:给定 8,DA=6,则 A 的“6 部分”PA 是 66,因为 A 中有 2 个 6。
现给定 A、DA、B、DB,请编写程序计算 PA+PB。
输入格式:
输入在一行中依次给出 A、DA、B、DB,中间以空格分隔,其中 0。
输出格式:
在一行中输出 PA+PB 的值。
输入样例 1:
3862767 6 13530293 3
输出样例 1:
399
输入样例 2:
3862767 1 13530293 8
输出样例 2:
0
#includeint main(){ long long A,DA,B,DB; scanf("%lld%lld%lld%lld",&A,&DA,&B,&DB); long long PA = 0,PB=0; while(A!=0){ if(A%10==DA) PA = PA*10+DA; A /= 10; } while(B!=0){ if(B%10==DB) PB = PB*10+DB; B /= 10; } printf("%lld",PA+PB); return 0; }
B1026 程序运行时间
要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”。同时还有一个常数 CLK_TCK,给出了机器时钟每秒所走的时钟打点数。于是为了获得一个函数 f 的运行时间,我们只要在调用 f 之前先调用 clock(),获得一个时钟打点数 C1;在 f 执行完成后再调用 clock(),获得另一个时钟打点数 C2;两次获得的时钟打点数之差 (C2-C1) 就是 f 运行所消耗的时钟打点数,再除以常数 CLK_TCK,就得到了以秒为单位的运行时间。
这里不妨简单假设常数 CLK_TCK 为 100。现给定被测函数前后两次获得的时钟打点数,请你给出被测函数运行的时间。
输入格式:
输入在一行中顺序给出 2 个整数 C1 和 C2。注意两次获得的时钟打点数肯定不相同,即 C1 < C2,并且取值在 [。
输出格式:
在一行中输出被测函数运行的时间。运行时间必须按照 hh:mm:ss
(即2位的 时:分:秒
)格式输出;不足 1 秒的时间四舍五入到秒。
输入样例:
123 4577973
输出样例:
12:42:59
#includeint main(){ int c1,c2; scanf("%d%d",&c1,&c2); int ans = c2-c1; if(ans%100 >= 50){ ans = ans/100 + 1; }else{ ans = ans/100; } printf("%02d:%02d:%02d",ans/3600,ans%3600/60,ans%60); return 0; }
B 1046 划拳
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。
输入格式:
输入第一行先给出一个正整数 N(≤),随后 N 行,每行给出一轮划拳的记录,格式为:
甲喊 甲划 乙喊 乙划
其中喊
是喊出的数字,划
是划出的数字,均为不超过 100 的正整数(两只手一起划)。
输出格式:
在一行中先后输出甲、乙两人喝酒的杯数,其间以一个空格分隔。
输入样例:
5
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
输出样例:
1 2
#includeint main(){ int n,faila=0,failb=0; int a1,a2,b1,b2; scanf("%d",&n); for(int i=0;i ){ scanf("%d%d%d%d",&a1,&a2,&b1,&b2); if(a1+b1==a2 && a1+b1!=b2){ failb++; } if(a1+b1!=a2 && a1+b1==b2){ faila++; } } printf("%d %d",faila,failb); return 0; }
3.2 查找元素
给定一些元素,然后查找某个满足某条件的元素。
codeup 1934
题目描述
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
输入
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
输出
对于每组输入,请输出结果。
样例输入
4
1 2 3 4
3
样例输出
2
#includeconst int maxn = 210; int a[maxn]; int main(){ int n,x; while(scanf("%d",&n)!=EOF){ for(int i=0;i ){ scanf("%d",&a[i]); } scanf("%d",&x); int k; for(k=0;k ){ if(a[k]==x){ printf("%d\n",k); break; } } if(k==n){ printf("-1\n"); } } return 0; }
3.3 图形输出
PAT B1036 跟奥巴马一起编程
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!
输入格式:
输入在一行中给出正方形边长 N(3)和组成正方形边的某种字符 C,间隔一个空格。
输出格式:
输出由给定字符 C 画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的 50%(四舍五入取整)。
输入样例:
10 a
输出样例:
aaaaaaaaaa
a a
a a
a a
aaaaaaaaaa
#includeint main(){ int row,col; char c; scanf("%d %c",&col,&c); for(int i=0;i ){ printf("%c",c); } printf("\n"); if(col%2==1) row = col/2 +1; else row = col/2; for(int i=0;i 2;i++){ printf("%c",c); for(int k=0;k 2;k++){ printf(" "); } printf("%c\n",c); } for(int i=0;i ){ printf("%c",c); } return 0; }
3.4 日期处理
题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出
每组数据输出一行,即日期差值
样例输入
20130101
20130105
样例输出
5
#includeint month[13][2] = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31}, {30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}}; bool isLeap(int year){ return ((year%4==0 && year%100!=0) || year%400==0); } int main(){ int time1,time2; while(scanf("%d%d",&time1,&time2)!=EOF){ if(time1>time2){ int temp = time1; time1 = time2; time2 = temp; } int year1,month1,day1; int year2,month2,day2; year1 = time1 / 10000; year2 = time2 / 10000; month1 = time1 % 10000 / 100; month2 = time2 % 10000 / 100; day1 = time1 % 100; day2 = time2 % 100; int ans=1; while( year1 < year2|| month1 day2){ day1++; if(day1 == month[month1][isLeap(year1)] + 1){ month1++; day1 = 1; } if(month1 == 13){ year1 ++ ; month1 = 1; } ans++; } printf("%d\n",ans); } return 0; }
3.5 进制转换