输入 若干群直角坐标点,每个群起始为一个整数n,后面跟有n个坐标。坐标用一对小数x,y表示(-100000.0<x,y<100000.0)。 输出 每群坐标以一行的格式输出离原点最远的距离,四舍五入保留2位小数。C++
时间: 2023-12-03 17:46:27 浏览: 39
以下是C++代码实现:
```cpp
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
double x, y, max_dis;
cin >> n;
while (n != 0) {
max_dis = 0;
for (int i = 0; i < n; i++) {
cin >> x >> y;
double dis = sqrt(x * x + y * y);
if (dis > max_dis) {
max_dis = dis;
}
}
cout.setf(ios::fixed);
cout.precision(2);
cout << max_dis << endl;
cin >> n;
}
return 0;
}
```
输入格式为每个群的起始整数n,后面跟有n个坐标,以此类推。通过while循环不断读入每个群的坐标,计算每个坐标到原点的距离,并找出最大距离。最后将最大距离输出即可。
需要注意的是,输出结果需要四舍五入保留2位小数,可以使用cout.setf和cout.precision函数设置输出格式。
相关问题
使用c语言结构体定义平面直角坐标系上的点,输入n个点,对这些点的x轴坐标排序并输出。
可以按照以下步骤编写程序:
1. 定义平面直角坐标系上的点的结构体。
```c
typedef struct {
double x;
double y;
} Point;
```
2. 读入 n 个点的坐标,存储到结构体数组中。
```c
int n;
printf("请输入点的数量:");
scanf("%d", &n);
Point points[n];
for (int i = 0; i < n; i++) {
printf("请输入第%d个点的坐标(用空格隔开):", i + 1);
scanf("%lf %lf", &points[i].x, &points[i].y);
}
```
3. 对这些点的 x 轴坐标排序。可以使用冒泡排序或快速排序等算法,这里演示冒泡排序的方法。
```c
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (points[j].x > points[j+1].x) {
// 交换两个点的坐标
Point temp = points[j];
points[j] = points[j+1];
points[j+1] = temp;
}
}
}
```
4. 输出排序后的点的 x 轴坐标。
```c
printf("按 x 轴坐标从小到大排序后的点的坐标如下:\n");
for (int i = 0; i < n; i++) {
printf("(%lf, %lf)\n", points[i].x, points[i].y);
}
```
完整代码如下:
```c
#include <stdio.h>
typedef struct {
double x;
double y;
} Point;
int main() {
int n;
printf("请输入点的数量:");
scanf("%d", &n);
Point points[n];
for (int i = 0; i < n; i++) {
printf("请输入第%d个点的坐标(用空格隔开):", i + 1);
scanf("%lf %lf", &points[i].x, &points[i].y);
}
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (points[j].x > points[j+1].x) {
// 交换两个点的坐标
Point temp = points[j];
points[j] = points[j+1];
points[j+1] = temp;
}
}
}
printf("按 x 轴坐标从小到大排序后的点的坐标如下:\n");
for (int i = 0; i < n; i++) {
printf("(%lf, %lf)\n", points[i].x, points[i].y);
}
return 0;
}
```
用c++实现已知直角坐标系中的n个点,返回这些点的边界点连线的多边形
这个问题可以使用凸包算法来解决。凸包是一个用线段连接边界点的多边形,这个算法可以在几何学和计算几何中广泛应用。
以下是使用 C++ 实现的 Graham 扫描算法的伪代码,该算法可以在 O(nlogn) 的时间内解决问题:
```c++
struct Point {
int x, y;
};
bool cmp(Point a, Point b) {
if (a.x != b.x) {
return a.x < b.x;
} else {
return a.y < b.y;
}
}
bool ccw(Point a, Point b, Point c) {
return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);
}
vector<Point> convex_hull(vector<Point>& points) {
int n = points.size();
sort(points.begin(), points.end(), cmp);
vector<Point> hull;
for (int i = 0; i < n; i++) {
while (hull.size() >= 2 && !ccw(hull[hull.size() - 2], hull[hull.size() - 1], points[i])) {
hull.pop_back();
}
hull.push_back(points[i]);
}
int t = hull.size() + 1;
for (int i = n - 2; i >= 0; i--) {
while (hull.size() >= t && !ccw(hull[hull.size() - 2], hull[hull.size() - 1], points[i])) {
hull.pop_back();
}
hull.push_back(points[i]);
}
hull.pop_back();
return hull;
}
```
该算法首先按照 x 坐标进行排序,然后将点插入到凸包中。在每个新点插入后,检查是否需要删除凸包中的点以保持凸包的性质。这是通过检查新点是否在当前凸包的右侧来完成的。在最后,我们还需要删除重复的点。
使用该函数,您可以将点存储在一个 std::vector\<Point\> 中,并将返回的凸包存储在另一个 std::vector\<Point\> 中。