也是真的想吐槽,这个B练习题,网上一搜代码都是一样的,我是垃圾,不会写,所以上网抄别人的思路,不是,你们这些会写的,怎么思路都一摸一样啊。
PTA真的拉跨,试卷也是拉跨。吐槽完了,记录一下别人的思路,毕竟我是最菜的
7-20 简单计算器(20 分) 模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式: 输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式: 在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:
输出样例:
他人代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 #include <stdio.h> int main () { int n1, n2; char ch; scanf ("%d" , &n1); while (1 ) { scanf ("%c" , &ch); if (ch=='=' ){ printf ("%d\n" , n1); break ; } else { scanf ("%d" , &n2); } if (ch=='+' ) n1 += n2; else if (ch=='-' ) n1 -= n2; else if (ch=='*' ) n1 *= n2; else if (ch=='/' ) { if (n2==0 ) { printf ("ERROR\n" ); break ; } else { n1 /= n2; } } else { printf ("ERROR\n" ); break ; } } return 0 ; }
7-27 兔子繁衍问题 7-27 兔子繁衍问题
分数 15
作者 徐镜春
单位 浙江大学
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N 对?
输入格式: 输入在一行中给出一个不超过10000的正整数N 。
输出格式: 在一行中输出兔子总数达到N 最少需要的月数。
输入样例:
输出样例:
代码长度限制
16 KB
时间限制
400 ms
内存限制
这个题目我也不会做,我也是有点抽象的,这个本质是一个斐波那契数列
但是我没有发现,我也是一个纯纯的笨蛋了
代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main (void ) { int a = 0 , b = 1 , temp, N, month = 1 ; scanf ("%d" , &N); while (b < N) { month++; temp = a; a = b; b = b + temp; } printf ("%d\n" , month); return 0 ; }
7-29 二分法求多项式单根 这题的一开始写的代码,运行超时了
这个是我写的代码,但是问题比较大,于是,学习一下,别人的代码
错误代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> float funct (int a3,int a2 ,int a1 ,int a,float num) { return a3 * num * num * num + a2 * num * num + a1 * num + a; } int main (void ) { int a3 = 0 , a2 = 0 , a1 = 0 , a = 0 ; float left = 0 , right = 0 ,mid=0 ; scanf ("%d %d %d %d" , &a3, &a2, &a1, &a); scanf ("%f %f" , &left, &right); while (1 ) { mid = (left + right) / 2 ; if (funct(a3, a2, a1, a, mid) == 0 ) { printf ("%0.2f" , mid); break ; } else if (funct(a3, a2, a1, a, left) * funct(a3, a2, a1, a, mid) > 0 ) { left = mid; } else right = mid; } return 0 ; }
错误的点: 这题,我确实是哈皮,这题也只能找一些无限接近于0的点,所以是要人为设置极限的,但是我没有明白,所以就错的蛮多的
改后的代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> double funct (double a3, double a2, double a1, double a, double x) { return a3 * x * x * x + a2 * x * x + a1 * x + a; } int main (void ) { double left = 0 , right = 0 , mid = 0 ; double a3 = 0 , a2 = 0 , a1 = 0 , a = 0 ; scanf ("%lf %lf %lf %lf %lf %lf" , &a3, &a2, &a1, &a, &left, &right); while (right - left >= 0.001 && funct(a3,a2,a1,a,left) * funct(a3,a2,a1,a,right) <= 0 ) { if (funct(a3,a2,a1,a,left) == 0 ) { mid = left; break ; } if (funct(a3,a2,a1,a,right) == 0 ) { mid = right; break ; } mid = (left + right) / 2.0 ; if (funct(a3,a2,a1,a,left) * funct(a3,a2,a1,a,mid) > 0 ) { left = mid; } else right = mid; } printf ("%.2lf" , mid); return 0 ; }
别人的代码好在哪里: 别人的代码,使用了一个全局变量,考虑到了这个人为设置极限的点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include <stdio.h> double a3,a2,a1,a0;double f (double x) { return a3*x*x*x+a2*x*x+a1*x+a0; } int main () { double a,b,mid; scanf ("%lf %lf %lf %lf" ,&a3,&a2,&a1,&a0); scanf ("%lf %lf" ,&a,&b); while (b-a>=1e-4 && f(a)*f(b)<=0 ){ if (f(a)==0 ){ mid=a; break ; } if (f(b)==0 ){ mid=b; break ; } mid=(a+b)/2 ; if (f(mid)==0 ){ break ; }else { if (f(mid)*f(a)>=0 ){ a=mid; }else { b=mid; } } } printf ("%.2f" ,mid); return 0 ; }
7-36 韩信点兵 在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
按从1至5报数,记下最末一个士兵报的数为1;
再按从1至6报数,记下最末一个士兵报的数为5;
再按从1至7报数,记下最末一个士兵报的数为4;
最后按从1至11报数,最末一个士兵报的数为10;
请编写程序计算韩信至少有多少兵。
输入格式: 本题无输入
输出格式: 输出韩信至少拥有的士兵人数。
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
这题是简单的,但是我的直觉告诉我,应该有更好的代码,这是我的暴力算法
我的代码 1 2 3 4 5 6 7 8 9 10 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main (void ) { for (int i = 0 ; i < 5 *6 *7 *11 ; i++) { if (i % 5 == 1 && i % 6 == 5 && i % 7 == 4 && i % 11 == 10 ) { printf ("%d" , i); } } return 0 ; }
不过我简单的找了一下,不是LeetCode上,别人的好代码,没有显示出来
找到的,都是和我差不多的垃圾代码
7-38 支票面额 这题就是我不会的题目了,也是非常的讨厌的,这题就不会了,我也是一个纯纯的笨蛋
一个采购员去银行兑换一张y 元f 分的支票,结果出纳员错给了f 元y 分。采购员用去了n 分之后才发觉有错,于是清点了余额尚有2y 元2f 分,问该支票面额是多少?
输入格式: 输入在一行中给出小于100的正整数n 。
输出格式: 在一行中按格式y.f
输出该支票的原始面额。如果无解,则输出No Solution
。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
错误原因: 这题我确实是应该错的,这题我没有一点点的思路,是真的一点点都没有,换算也不清楚,所以查看其它人的代码。
我真的是痴呆了,元和分的换算公式也能弄错,还有就是我考虑到了,兑换之前的和兑换之后的是两倍,但是我还是没有写出公式
大喊30遍,我是哈皮,题目看错了,我以为的是
采购员去银行兑换,出纳员给错了,然后出纳员用去了n元,余额也是出纳员的,这我怎么可能做的出来,这样有不等式的关系,其实就是可以做的,是我蠢猪了
然后就是这个是有公式的
又因为f是分,所以
上面两个式子一结合等于
f的最大值,是100(无法取到),一算就是
综上所述,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main (void ) { int y = 0 , f = 0 , n = 0 ,flag=0 ; scanf ("%d" , &n); for (int y = 0 ; y < 49 ; y++) { for (int f = 0 ; f < 100 ; f++) { if (98 * f - 199 * y == n) { flag = 1 ; printf ("%d.%d" , y, f); } } } if (!flag) printf ("No Solution" ); return 0 ; }
7-39 龟兔赛跑 乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式: 输入在一行中给出比赛时间T(分钟)。
输出格式: 在一行中输出比赛的结果:乌龟赢输出@_@
,兔子赢输出^_^
,平局则输出-_-
;后跟1空格,再输出胜利者跑完的距离。
输入样例:
输出样例:
代码长度限制
16 KB
时间限制
400 ms
内存限制
错误原因, 这题我确实是一点思路都没有,这题,数学的问题,就感觉很头疼
这题的代码和思路,主要是Copy这个大佬的,地址如下,代码也如下:
https://www.cnblogs.com/haimeng-lin/p/15427074.html
本题乌龟的路程很简单,计算兔子的路程关键就在怎么区分兔子跑步的时间。引入两个参数,run参数显示兔子状态,为1则在跑步,为0则在睡觉;参数sleeptime显示开始睡觉的时间。
当run = 1时,兔子路程计入;满足三个条件时开始睡觉:①时间为十的倍数;②兔子目前在跑步,也就是run = 1;③兔子路程大于乌龟路程。满足条件开始睡觉,记录睡觉时间,到时间后run改为1自动苏醒。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main (void ) { int turtle = 0 , rabbit = 0 , t = 0 , run = 0 , sleeptime = 0 ; scanf ("%d" , &t); for (int i = 1 ; i <= t; ++i) { turtle += 3 ; if (run == 0 ) rabbit += 9 ; if ((i % 10 == 0 ) && (rabbit > turtle) && (run == 0 )) { run = 1 ; sleeptime = i; } if (i == sleeptime + 30 ) { run = 0 ; } } if (rabbit > turtle) printf ("^_^ %d" , rabbit); else if (rabbit == turtle) printf ("-_- %d" , rabbit); else printf ("@_@ %d" , turtle); return 0 ; }