天天快乐编程2020寒假基础班(临海)作业题解
1.5287: 游戏之我不是签到题
这个题目就是输入两个字符,是'A'和'C'或者'W'和'A',所以你需要两个字符去存储,你在判断能出现的也只能是' '(单引号)。
我们可以读入,判断第一个字符,因为他们两个不一样。是'A'就输出"WA",是'W'就输出"AC"
#include <bits/stdc++.h> using namespace std; int main() { char a, b; cin >> a >> b; if (a == 'A') { cout << "WA\n"; } else { cout << "AC\n"; } return 0; }
2.5221: 重要的话说三遍
这个题目就是让你输出三行"I'm gonna WIN!"
#include<bits/stdc++.h> using namespace std; int main() { cout<<"I'm gonna WIN!\n"; cout<<"I'm gonna WIN!\n"; cout<<"I'm gonna WIN!\n"; return 0; }
3.1489: C语言实验题――字符编码
读入5个char类型的字符,用原来的字母后面的第4个字母代替原来的字母就是把这个字符+4。
这个题目你的输入以及输出必须是char类型的。
#include <bits/stdc++.h> using namespace std; int main() { char a, b, c, d, e; cin >> a >> b >> c >> d >> e; a += 4; b += 4; c += 4; d += 4; e += 4; cout << "password is " << a << b << c << d << e; return 0; }
4.3068: 阿基米德特性
这个题目实际上是个数学题目,是不等式变换,但是不要紧我们也可以看看。
aM>b,比如2M>6,我们是不是可以试出来M=4,是不是和6/2=3有关呢。
再试一个 5M>29,M=6,和29/5还有关吗。
是不是M>b/a(直接按照不等式的思想就是a到右边,a为正数,不变号)。
所以我们只需要解决大于(b/a)的最小整数了。
1.正好整除需要+1,2.有余数也需要+1,所以这个题目答案就是b/a+1。
#include <bits/stdc++.h> using namespace std; int main() { int a, b; cin >> a >> b; cout << b / a + 1; return 0; }
5.1175: C语言实验题――时间间隔
我们可以把这个时间转换为秒,两个相减就是时间间隔t了。
(1)t怎么知道有多少小时呢,除以3600。
t怎么知道还有多少分呢,就是小时剩下的余数即%3600,之后/60。
t怎么知道还有多少秒呢,就是小时剩下的余数即%3600,再%60,得到剩下的秒。当然也可以一步到位直接%60。
#include <bits/stdc++.h> using namespace std; int main() { int h1, m1, s1; char c; //中间还有:,要像IP地址一样用char读取掉 cin >> h1 >> c >> m1 >> c >> s1; int h2, m2, s2; cin >> h2 >> c >> m2 >> c >> s2; //按照1小时是3600秒,1分钟是60秒进行转换 int sum = (h1 * 3600 + m1 * 60 + s1) - (h2 * 3600 + m2 * 60 + s2); //如果时间差是负数,取正数 if (sum < 0) sum = -sum; int h3, m3, s3; //得到小时数 h3 = sum / 3600; //得到分钟数 m3 = (sum % 3600) / 60; //得到秒数 s3 = (sum % 3600) % 60; printf("%d:%02d:%02d\n", h3, m3, s3); return 0; }
(2)t怎么知道有多少秒呢,可以%60,过河拆桥除以60把秒给抛弃掉。
t怎么知道还有多少分呢,可以%60,因为你已经把秒给抛弃掉了,那么你现在拿到的就是分钟数,过河拆桥除以60把分钟丢弃。
t怎么知道还有多少小时呢,过河拆桥剩下的就是。
我们常用的数字是10进制的,时间你可以理解为是60进制的数。
#include <bits/stdc++.h> using namespace std; int main() { int h1, m1, s1; char c; //中间还有:,要像IP地址一样用char读取掉 cin >> h1 >> c >> m1 >> c >> s1; int h2, m2, s2; cin >> h2 >> c >> m2 >> c >> s2; //按照1小时是3600秒,1分钟是60秒进行转换 int sum = (h1 * 3600 + m1 * 60 + s1) - (h2 * 3600 + m2 * 60 + s2); //如果时间差是负数,取正数 if (sum < 0) sum = -sum; int h3, m3, s3; //得到秒 s3 = sum % 60; sum /= 60; //得到小时 m3 = sum % 60; sum /= 60; //得到分 h3 = sum; printf("%d:%02d:%02d\n", h3, m3, s3); return 0; }
6.5174: 时间转换
这个题目直接告诉你时间间隔t了,让你转换一下。
#include <bits/stdc++.h> using namespace std; int main() { int sum; cin >> sum; int h, m, s; //得到秒 s = sum % 60; sum /= 60; //得到小时 m = sum % 60; sum /= 60; //得到分 h = sum; printf("%d:%d:%d", h, m, s); return 0; }
7.1003: 1、2、3、4、5...
这个题目就是完整的鸡兔同笼问题了,鸡兔同笼的一般解法为。
假设笼子里全是鸡,那么脚的总只数会比实际小,少算的脚只数就是多算的兔子脚数,这个值是m-2*n。兔子数就是脚数/2,也就是(m-2*n)/2,鸡的只数就是n减去兔子的只数
会解方程的直接用解方程求解,但是我们可以算出来负数吗,我们由于进行了取整,所以最后脚数也不一定正确,需要判断。
#include <bits/stdc++.h> using namespace std; int main() { int m,n; while(cin>>n>>m,m||n) { int y=(m-2*n)/2; int x=n-y; //进行判断,数目不能为负且脚数需要足够 if(x>=0&&y>=0&&2*x+4*y==m) { cout<<x<<" "<<y<<"\n"; } else { cout<<"Error\n"; } } return 0; }
8.5907: 药房管理
我们可以使用一个口袋去装没有取上药品人数,取上药了药品要减少取出的药品,没取上我们统计上。
#include <bits/stdc++.h> using namespace std; int main() { int m, n; cin >> m >> n; //没有取上药品人数为num int num = 0; for (int i = 1, x; i <= n; i++) { cin >> x; if (x <= m) { //取上了,药品总量要减少x m = m - x; } else { //没有取上 num++; } } cout << num <<"\n"; return 0; }
9.5610: 简单21点游戏
这个题目我们可以用一个口袋去装n个数的总和,之后分好牌、较好牌和差牌进行判断。
但是要输出距离,不能出现负数。
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; //牌面综合是sum int sum=0; for (int i = 0,x; i < n; i++) { cin >> x; sum += x; } if (sum == 21) { //21点,好牌 cout << "Yes\n"; } else if (sum >= 16 && sum <= 21) { //小于21,但离21比较近(小于等于5)是较好牌 cout << "Just so so"<< " " << 21 - sum <<"\n"; } else { //烂牌 cout << "No"<< " "; //要输出距离,直接相减会得到负数,需要分情况 if (sum > 21) { cout << sum - 21<<"\n"; } else { cout << 21 - sum <<"\n"; } } return 0; }
10.5286: 国庆七天乐
我们需要一个袋子去装当前AC的题目数,然后按格式输出即可。
#include <bits/stdc++.h> using namespace std; int main() { int x,y; cin>>x>>y; //第一天为x题 int num=x; //国庆七天,循环1到7 for(int i=1;i<=7;i++) { //按照格式进行输出 cout<<"10."<<i<<": AC "<<num<<"\n"; //明天要比今天多y题 num+=y; } return 0; }
11.5394: 跳一跳
我们需要用一个口袋去装这次的总分,但是还有加成分,我们可以再用一个口袋去装。
有很多局,还需要记录一个最高分,所以还需要一个口袋来装最高分。
#include <bits/stdc++.h> using namespace std; int main() { int x; //设置最大值为0,以及当前值为0 int ma=0,t=0; //设置加成分为0 int bonus=0; while (cin>>x) { if(x==0) { //本次结束,最大值需要更新就更新 if(t>ma)ma=t; //当前值以及加成分清空 t=0; bonus=0; } else if(x==1) { //跳中,+1即可 t++; //加成分清空 bonus=0; } else { //跳中中心,使用加成分 //加成分要比之前多2 bonus+=2; //当前值需要加上加成分 t=t+bonus; } } cout<<ma<<"\n"; return 0; }
12.1476: C语言实验题――圆周率
两边同乘上4,就是PI,所以我们可以求出右边答案。
所以看右面,分子全为1,分母就是我们要枚举1,3,5,7,9直到到4n-1。
然后第奇数项为正,偶数项为负。
把i/2也是奇偶相间的,所以就可以解决这个问题了。
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; double sum = 0; //枚举1,3,5到(4*n-1) for (int i = 1; i <= (4*n-1); i+=2) { //分两种情况进行讨论 if ((i/2)%2) sum -= 1.0 / i; else sum += 1.0 / i; } //输出保留五位小数 printf("%.5f\n", sum * 4); return 0; }
13.5218: 大笨钟
又来一个时间相关的题目,这个题目需要分情况进行讨论。
12:00之前(包括),都是不会Dang的,之后过正点才Dang。
#include <bits/stdc++.h> using namespace std; int main() { int h, m; char c; //中间:需要用char去存储 cin >> h >> c >> m; //12:00(包括)之前直接输出 if (h < 12 || h == 12 && m == 0) { printf("Only %02d:%02d. Too early to Dang.\n", h, m); } else { //超过12点要Dang(h-12)次 h -= 12; //这个小时已经开始,这个小时也需要Dang if (m) h++; while (h--) cout << "Dang"; cout << "\n"; } return 0; }
14.1093: 猴子分桃
这个题目就需要自己去思考了,而且也需要读懂题目。因为我们要能分为5堆,所以就不断*5。
但是第一次,还要多余1,所以这一次就是 1 + 5 * (sum - 1)。
然后再推回剩给老猴子的。
#include <bits/stdc++.h> using namespace std; int main() { int n; while (cin >> n, n) { //先求最小需要的桃子数,超过int要使用更大的整型 long long sum = 1; //每次让他正好分五堆 for (int i = 1; i < n; i++) sum *= 5; //因为要多一个留给老猴子,所以(sum-1)有五堆,还要加上老猴子的那个 sum = 1 + 5 * (sum - 1); //剩下的桃子数 long long t = sum; //当前的桃子数减去分给老猴子的,分为5堆,剩下4堆 for (int i = 1; i <= n; i++) t = (t - 1) / 5 * 4; //n次每次都会分给老猴子一个桃子,总共的需要加上 t += n; cout << sum << " " << t << endl; } return 0; }
15.1418: 复习时间
可以复习m门课,但是m是无关变量。
复习一门课的效率为100和这门课的难度差的平方,数字越小这个值越大,我们我们需要一个袋子去装最小值。
#include<bits/stdc++.h> using namespace std; int main() { int T; cin >> T; while (T--) { int n, m; cin >> n >> m; int ma; //无论如何先偷过来 cin>>ma; //从1到n看看是否需要更新 for (int i = 1,x; i < n; i++) { cin>>x; //比当前的难度还小,更新 if(x<ma)ma=x; } //按照题意输出 cout<< (100 - ma) * (100 - ma)<<"\n"; } return 0; }
16.5139: 血压
这个题目不难,读入到EOF,你给while,作为他的判断条件,他会帮你解决的。
然后我们可以用一个袋子去统计有多少个人血压正常。
之后还有两种情况让你输出,不能忘记。
#include <bits/stdc++.h> using namespace std; int main() { int n; while (cin >> n) { int num = 0; for (int i = 1,x,y; i <= n; i++) { cin >> x >> y; if (x >= 90 && x <= 140 && y >= 60 && y <= 90) { num++; } } cout << num << endl; if (num == n) { //所有人血压都正常 cout << "Perfect\n"; } if (num == 0) { //所有人血压都不正常 cout << "Terrible\n"; } } return 0; }
17.1478: C语言实验题――打印金字塔
课堂上打印图形的一个相似题目,我们仍需要分情况来看。
比如样例,第1行有4个空格,第2行有2个空格,第3行有0个空格,第i行有(n-i)*2个空格。
之后正着输出一次,倒着输出一次。
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { //输出(n-i)*2个空格 for (int j = 0; j < (n - i)*2; j++) cout << " "; //正着输出 for (int j = 1; j <= i; j++) { //1前面没有空格 if (j!=1)cout << " "; cout << j; } //倒着输出 for (int j = i-1; j >=1; j--) cout << " " << j; cout << endl; } return 0; }
18.4982: 打印正方形
这个题目还是需要找规律,但是规律并不方便找出来,我们可以单独对第一行和最后一行处理。
如果要找规律是这样的,第一行、第一列、第m行第n列不是空格。
正方形四个顶点是'+',第一行最后一行的是'-',其他是'|'。
这个不仅要找规律,还要很好的控制自己的代码。
#include <bits/stdc++.h> using namespace std; int main() { int n; while (cin >> n) { //行数只有列数的一半+1 int m = n / 2 + 1; //循环每一行 for (int i = 1; i <= m; i++) { //循环每一列 for (int j = 1; j <= n; j++) { //满足四种情况,不是空格 if (i == 1 || j == 1 || i == m | j == n) { //如果是四个顶点输出'+' if ( i == 1 && j == 1 || i == 1 && j == n|| i == m && j == 1 || i == m && j == n) cout << "+"; else if (i == 1 || i == m) cout << "-"; else cout << "|"; } else cout << " "; } cout << "\n"; } } return 0; }
本文来自博客园,作者:暴力都不会的蒟蒻,转载请注明原文链接:https://www.cnblogs.com/BobHuang/p/12297463.html