牛客网OJ题解--20210313
栗酱数数
https://ac.nowcoder.com/acm/problem/14673
本系列记录翀翀😐痛苦的刷题日志,所有题目均来自于牛客网OJ题目,坚持刷题谈起来容易做起来难,希望我可以坚持下去,这里仍然分享一段励志文案:每个人都有梦想,然而有些人把梦想变成了现实,有些人的梦想依旧是梦想,只因为他们为梦想付出的努力程度不一样,他们坚持的时间不一样,最终才有这样的结果。
NC14673-栗酱数数
题目链接
https://ac.nowcoder.com/acm/problem/14673
题目描述
栗酱在酒桌上玩一个小游戏,第一个人从1开始数数,如果遇到数字中含4或者数字是4的倍数则跳过报下一个,谁数错了就要罚酒一杯。所以栗酱想让你写个程序把所有数生成出来,这样她就可以作弊直接读了。你一定能解决的吧?只有一组数据,一个数n代表从1开始数到n。(n≤100000),按顺序输出所有1到n之间任何一位都不是4的数,每两个数之间用一个回车隔开。
测试样例
输入
9
输出
1 2 3 5 6 7 9
解题思路
实际上就是一个枚举法,这里主要是练习一下用while不断模10取最后一位
解题代码
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { if (i % 4 == 0) continue; bool v = true; int k = i; while (k != 0) { if (k % 10 == 4) { v = false; break; } k /= 10; } if (v) { cout << i << endl; } } system("pause"); return 0; }
NC14676-裁缝大师
题目链接
https://ac.nowcoder.com/acm/problem/14676、
题目描述
坤酱想把一块圆形的布裁成正多边形,于是请你告诉坤酱正多边形的几个顶点应在哪里? 为了方便表示,圆给出在坐标系中,正多边形的第一个顶点固定在该圆在平行于x轴正方向最远的位置上,请按顺时针顺序输出所有的顶点。输入第一行给出单独一个整数T,表示数据组数接下来T行,每行顺序给出四个整数x,y,R,N:表示圆心为(x,y),半径为R,裁出一个正N边形。−104≤x,y≤104,0<R≤103,3≤N≤50。
对于每组数据,输出N行,从第一个顶点开始,按顺时针顺序输出所有N个顶点的坐标。
(由于坤酱工具有限,你只需保留2位小数)
测试样例
输入
2 0 0 10 4 100 0 1 3
输出
10.00 0.00 0.00 -10.00 -10.00 0.00 0.00 10.00 101.00 0.00 99.50 -0.87 99.50 0.87
解题思路
首先求出一个内角k=2pi/n的大小,然后从0度开始,每次减去一个内角,然后算Rsink和Rcosk也就是坐标变化量,然后用初始坐标相加即可。难点在于-0.0要标准化为0.0同时对于很小的10^-6以下的值也要标准化为0.0,这样类似于0.000001的值也会标准化为0.0从而实现和题目要求的小数位。
解题代码
#include <bits/stdc++.h> using namespace std; //pi的定义,学习了 const double pi(acos(-1)); int main() { int t; cin >> t; while (t--) { double cx, cy, r, n; cin >> cx >> cy >> r >> n; //一个内角的大小 double k = 2 * pi / n; //其实就是每次旋转一个内角,然后坐标加上cos和sin的值即可 for (int i = n; i; i--) { //sin函数和cos函数都是接受的参数为弧度 double a = cx + cos(k * i) * r; double b = cy + sin(k * i) * r; //核心:当小于1e-6应该是0.0 if (fabs(a) < 1e-6) a = 0.0; if (fabs(b) < 1e-6) b = 0.0; cout << fixed << setprecision(2) << a << " " << b << endl; } } system("pause"); return 0; }