因为带测试数据,所以就稍微分开一些。
以下有矢量加减法、求斜率、求一堆点中一条直线能包括的最多点的数量、点积运算
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
double ax[5] = {1, 2, 3, 9, 10};
double ay[5] = {1, 2, 3, 10, 11};
//为了方便全部都是double型
//两个矢量的加减法,x1 +- x2,y1 +- y2
void addAndSub(double x1, double y1, double x2, double y2){
double x = x1 + x2;
double y = y1 + y2;
//看题目情况,不知道返回值要带啥
cout << "x = " << x << endl;
cout << "y = " << y << endl;
}
//求斜率
double sumK(double x, double y){
double k = y / x; //以(0, 0)为原点的话,不然需要带上(x0, y0)求差值再算
return k;
}
//求斜率的延伸,求有多少个点在(x1, y1)and(x2, y2)的连线上POJ1118
int sumOfPoint(int n){
int maxSum = 2; //最初肯定有两个点在这个线上
for(int i = 0; i < n; i++){
//数据都存放在数组当中,令j = i + 1就避免了重复计算
for(int j = i + 1; j < n; j++){
int sum = 2;
for(int k = j + 1; k < n; k++){
//这里以我的风格是ax存放x的值,ay存放y的值
if((ax[i] - ax[j]) * (ay[i]- ay[k]) == (ax[i] - ax[k]) * (ay[i] - ay[j])){
sum++;
}
}
if(sum > maxSum){
maxSum = sum;
}
}
}
return maxSum;
}
//点积运算
double Dot(double x1, double y1, double x2, double y2){
return x1 * x2 + y1 * y2;
}
int main(){
//测试点(2, 1)and(1, 1)相加
cout << "测试点(2, 1)and(1, 1)相加" << endl;
addAndSub(2, 1, 1, 1);
//测试多个点中一条线能覆盖最多的点
cout << "测试多个点中一条线能覆盖最多的点(应该输出3)" << endl;
cout << sumOfPoint(5) << endl; //应该输出3
//测试点(1, 1)and(1, 1)的点积运算(以(0, 0)为原点
cout << "测试点(1, 1)and(1, 1)的点积运算(应该输出2)" << endl;
cout << Dot(1, 1, 1, 1) << endl;
return 0;
}