2073.无限的路
题目描述
http://acm.hdu.edu.cn/showproblem.php?pid=2073http://acm.hdu.edu.cn/showproblem.php?pid=2073
Problem Description
甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:
甜甜的好朋友蜜蜜发现上面的图还是有点规则的,于是他问甜甜:在你画的图中,我给你两个点,请你算一算连接两点的折线长度(即沿折线走的路线长度)吧。
Input
第一个数是正整数N(≤100)。代表数据的组数。
每组数据由四个非负整数组成x1,y1,x2,y2;所有的数都不会大于100。
Output
对于每组数据,输出两点(x1,y1),(x2,y2)之间的折线距离。注意输出结果精确到小数点后3位
运行代码
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
double d(int x, int y)
{
double sqrt2 = sqrt(2), sum = 0;
for (int i = 1; i < x + y; i++)
sum += sqrt2 * i;
sum+= sqrt2 * x;
for (int i = 0; i < x + y; i++)
sum+= sqrt(i * i + (i + 1) * (i + 1));
return sum;
}
int main() {
int n;
cin >> n;
while (n--) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
cout << fixed << setprecision(3) << fabs(d(x1, y1) - d(x2, y2)) << endl;
}
return 0;
}
代码思路
-
函数
d(x, y)
:- 这个函数计算了一个累积距离,但计算逻辑可能与题目要求不符。
- 首先,它通过一个循环累加了
sqrt2 * i
,其中sqrt2
是根号2,i
从1到x+y-1
,累加按一定规则增长的距离。 - 接着,它又累加了一系列基于
i
和i+1
计算的直角三角形斜边长度。
-
主函数
main()
:- 读取测试用例数量
n
,然后循环读取每组测试数据,即四个整数x1, y1, x2, y2
,代表两个点的坐标。 - 计算两个点各自到某个累积距离(由
d(x, y)
定义)的差的绝对值,并将结果保留三位小数后输出。
- 读取测试用例数量
2074.叠框
题目描述
http://acm.hdu.edu.cn/showproblem.php?pid=2074
Problem Description
需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
Input
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
Output
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
运行代码
#include <iostream>
using namespace std;
int main() {
char m[80][80];
int n;
char a, b, c;
bool flag = true;
while (cin >> n >> a >> b) {
if (flag == true) {
flag = false;
}
else {
cout << endl;
}
for (int i = 1; i <= n; i++) {
if (i % 2 == 0) {
c = b;
}
else {
c = a;
}
int start = n / 2 - i + 1, end = n / 2 + i;
for (int k = start; k <= end; k++) {
m[start][k] = c;
}
for (int k = start; k <= end; k++) {
m[k][start] = c;
}
for (int k = start; k <= end; k++) {
m[k][end - 1] = c;
}
for (int k = start; k <= end; k++) {
m[end - 1][k] = c;
}
}
if (n != 1) {
m[0][0] = ' ';
m[0][n - 1] = ' ';
m[n - 1][0] = ' ';
m[n - 1][n - 1] = ' ';
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << m[i][j];
}
cout << endl;
}
}
return 0;
}
代码思路
-
输入处理:程序首先读取三个输入值:
n
(图案的边长,即正方形的边长),a
和b
(两种字符,用于构造图案)。使用一个布尔标志flag
来控制输出之间是否需要换行,确保首次输出时不打印额外的换行。 -
二维数组
m
初始化:定义一个80x80的字符型二维数组m
来存储图案,实际上使用了前n
行和列。 -
图案生成逻辑:
通过两层循环实现。外层循环遍历从1到n
,内层循环负责在每一轮根据当前行数i
确定使用字符a
还是b
(如果i
是偶数则用b
,否则用a
)。- 内层循环有四部分,分别负责在四个方向上填充字符
c
:从左上到右上对角线从左到右的水平线从左下到右下的对角线从上到下的垂直线 - 这样的循环结构保证了以正方形中心为对称轴,按层向外构建图案,每层使用相同的字符。
- 内层循环有四部分,分别负责在四个方向上填充字符
-
处理特殊情况:当
n
不等于1时,将正方形的四个角落设置为空格,以保持内部图案的连续性。 -
输出图案:最后,遍历二维数组
m
并打印,形成所需的图案样式。
根据用户指定的边长n
及两种字符a
和b
,生成一个具有特定对称性的字符图案,其中图案的每个“圈层”交替使用a
和b
字符。
2075.A|B?
题目描述
http://acm.hdu.edu.cn/showproblem.php?pid=2075
Problem Description
正整数A是否能被正整数B整除,不知道为什么xhd会研究这个问题,来帮帮他吧。
Input
输入数据的第一行是一个数据T,表示有T组数据。
每组数据有两个正整数A和B(A,B<10^9)。
Output
对于每组输入数据,输出"YES"表示可以被整除,"NO"表示不能被整除。
运行代码
#include <iostream>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int A, B;
cin >> A >> B;
if (A % B == 0) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
}
return 0;
}
代码思路
-
输入测试用例数量:首先,程序读入一个整数
T
,表示有T
组测试数据。 -
循环处理每组测试数据:使用
while (T--)
循环,这意味程序会处理T
次测试用例。每次循环,T
的值减1,直到T
变为0,循环结束。 -
读取每组测试数据:在每次循环中,程序读取两个整数
A
和B
,分别代表被除数和除数。 -
判断能否整除并输出结果:利用条件语句
if (A % B == 0)
来检查A
是否能被B
整除。否则,如果不能整除,程序输出"No"(同样,原代码实际输出"NO"`,包含换行符)。如果A
模B
的结果为0(即A % B == 0
),说明A
能被B
整除,程序输出"Yes"(注意原代码实际输出的是"YES"`,包含换行符)。 -
结束程序:所有测试用例处理完毕后,程序正常结束,返回0。