#include void linear(double *x, double *y, int len, double *k, double *b) { if (len < 2) { return; } double xsum = 0; double ysum = 0; double xysum = 0; double x2sum = 0; for (int i = 0; i < len; i++) { xsum += x[i]; ysum += y[i]; xysum += x[i] * y[i]; x2sum += x[i] * x[i]; } double xbar = xsum / len; double ybar = ysum / len; double xybar = xysum / len; double x2bar = x2sum / len; *k = (xybar - xbar * ybar) / (x2bar - xbar * xbar); *b = ybar - (*k) * xbar; } double loss(double *x, double *y, int len) { double k, b; linear(x, y, len, &k, &b); double losssum = 0; for (int i = 0; i < len; i++) { losssum += (k * x[i] + b - y[i]) * (k * x[i] + b - y[i]); } double lossavg = losssum / len; return lossavg; } double *lossline(double *x, double *y, int len) { int i = 1; double *losspoint = (double *)malloc(sizeof(double) * len); for (; i < len; i++) { losspoint[i - 1] = loss(x, y, i + 1); } return losspoint; } void mysort(double *x, double *y, int len) { for (int i = 0; i < len; i++) { for (int j = 0; j < i; j++) { if (x[i] < x[j]) { double temp = x[i]; x[i] = x[j]; x[j] = temp; temp = y[i]; y[i] = y[j]; y[j] = temp; } } } } void pointat(double *x, double *y, int len, int *result) { mysort(x, y, len); double *ll = lossline(x, y, len); double *smothll = (double *)malloc(len * sizeof(double)); for (int i = 0; i < len; i++) { int start = i - 5; int end = i + 5; if (start < 0) { start = 0; } if (end > len) { end = len; } double sum = 0; for (int count = start; count < end; count++) { sum += ll[count]; } smothll[i] = sum / (end - start); } double *a = (double *)malloc(sizeof(double) * len - 10); for (int i = 5; i < len - 5; i++) { int s1 = 0; for (int j = i - 5; j < i + 5; j++) { s1 += smothll[j]; } s1 = s1 - 10 * smothll[i]; a[i - 5] = s1; } int index = 5; double max = a[0]; for (int i = 0; i < len - 10; i++) { if (a[i] > max) { max = a[i]; index = i + 5; } } *result = index; }