#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm> // std::swap
#define Max 9999999999999999999;
using namespace std;
unsigned seed;
struct problem{
double x_var [20];
double y_var [20];
double Sum [20] ;
}var_1,var_2;
// 初始
void init(){
for(int i=0;i<20;i++){
var_1.x_var[i] = 0;
var_1.y_var[i] = (double)Max;
var_1.Sum[i] = 0;
}
}
// sort 由小到大
void sort(){
// sort 由小到大
for(int i=0; i<19 /*&& flag == 1*/; i++){
//flag = 0;
for(int j=0;j<19;j++){
if(var_1.y_var[j] > var_1.y_var[j+1]){
swap( var_1.x_var[j] ,var_1.x_var[j+1]);
swap( var_1.y_var[j] ,var_1.y_var[j+1]);
}
}
}
}
void marry(){
// 配對前五組
for(int i=0,count=5;i<5;i++){
for(int j=i;j<4;j++){
var_1.x_var[count] = ( (var_1.x_var[i] + var_1.x_var[j+1]) / 2 );
count++;
}
}
}
void inputNum(double temp,double x_fifth,double x_fourth,double x_third,double x_second,double x_first,double x_zero){
for(int i=0;i<20;i++)
var_1.Sum[i] = 0;
// 寫成副程式 x5
if(x_fifth!=0){
for(int i=0;i<20;i++){
temp = 1;
if(var_1.x_var[i] != 0){
for(int j=0;j<5;j++){
temp = temp * var_1.x_var[i];
}
//存在係數中
var_1.Sum[i] = x_fifth * temp;
}
}
}
// 寫成副程式 x4
if(x_fourth!=0){
for(int i=0;i<20;i++){
temp = 1;
if(var_1.x_var[i] != 0){
for(int j=0;j<4;j++){
temp = temp * var_1.x_var[i];
}
//存在係數中
var_1.Sum[i] = var_1.Sum[i] + x_fourth * temp ;
}
}
}
// 寫成副程式 x3
if(x_third!=0){
for(int i=0;i<20;i++){
temp = 1;
if(var_1.x_var[i] != 0){
for(int j=0;j<3;j++){
temp = temp * var_1.x_var[i];
}
//存在係數中
var_1.Sum[i] = var_1.Sum[i]+ x_third * temp ;
}
}
}
// 寫成副程式 x2
if(x_second!=0){
for(int i=0;i<20;i++){
temp = 1;
if(var_1.x_var[i] != 0){
for(int j=0;j<2;j++){
temp = temp * var_1.x_var[i];
}
//存在係數中
var_1.Sum[i] = var_1.Sum[i] + x_second * temp ;
}
}
}
// 寫成副程式 x1
if(x_first!=0){
for(int i=0;i<20;i++){
temp = 1;
if(var_1.x_var[i] != 0){
for(int j=0;j<1;j++){
temp = temp * var_1.x_var[i];
}
//存在係數中
var_1.Sum[i] = var_1.Sum[i] + x_first * temp ;
}
}
}
// 寫成副程式 x0
if(x_zero!=0){
for(int i=0;i<20;i++){
if(var_1.x_var[i] != 0){
//存在係數中
var_1.y_var[i] = var_1.Sum[i] + x_zero;
}
}
}
}
int main() {
double x_fifth = 0,x_fourth = 0,x_third = 0,x_second = 0,x_first = 0,x_zero = 0;
double temp = 0;
int flag =0;
//int flag_2 = 0;
int count_i = 0;
int minSum = 0;
// 初始
init();
seed = (unsigned)time(NULL); // 取得時間序列
srand(seed); // 以時間序列當亂數種子
// 產生十組亂數 父代
for(int i=0;i<10;i++){
var_1.x_var[i] = (int) ( (rand()%100+1)-(rand()%100 +1) );
cout << var_1.x_var[i] << " ";
}
// 輸入
cout << endl;
cout << "X^5 = ";
cin >> x_fifth;
cout << "X^4 = ";
cin >> x_fourth;
cout << "X^3 = ";
cin >> x_third;
cout << "X^2 = ";
cin >> x_second;
cout << "X = ";
cin >> x_first;
cout << "常數 = ";
cin >> x_zero;
//解 y 值
inputNum(temp,x_fifth,x_fourth,x_third,x_second,x_first,x_zero);
/*
cout << "?????????????????????????????????" << endl;
for (int i=0;i<20;i++){
cout << "用x" << i << " = " << var_1.x_var[i] << "\t";
cout << "用y" << i << " = " << var_1.y_var[i] << endl;
}
cout << "------------------------------" << endl;
*/
// sort 由小到大
sort();
/*
for (int i=0;i<20;i++){
cout << "Soft後用x" << i << " = " << var_1.x_var[i] << "\t";
cout << "Soft後用y" << i << " = " << var_1.y_var[i] << endl;
}
cout << "------------------------------" << endl;
*/
while (minSum<50){
flag = 0;
for(int i=0;i<20;i++){
if(var_1.x_var[i] == var_1.x_var[i+1]){
flag++;
}
}
if( flag > 2 /*&& flag_2 < 2 */){
var_1.x_var[4] = var_1.x_var[0] * var_1.x_var[1];
//flag_2 ++;
}
/*
else{
var_1.x_var[4] = var_1.x_var[0] - ( 2 * var_1.x_var[1]);
flag_2 = 0;
}/*
/* 檢查用
for (int i=0;i<20;i++){
cout << "配對前x" << i << " = " << var_1.x_var[i] << "\t";
cout << "配對前y" << i << " = " << var_1.y_var[i] << endl;
}
cout << "??????????????????????????????????????????????" << endl;
*/
// 配對前五組
marry();
//解 y 值
inputNum(temp,x_fifth,x_fourth,x_third,x_second,x_first,x_zero);
/* 檢查用
for (int i=0;i<20;i++){
cout << "配對後用x" << i << " = " << var_1.x_var[i] << "\t";
cout << "配對後用y" << i << " = " << var_1.y_var[i] << endl;
}
cout << "************************************************" << endl;
*/
// 配對後sort 由小到大
sort();
minSum++;
/*
for (int i=0;i<20;i++){
cout << "配對Soft後用x" << i << " = " << var_1.x_var[i] << "\t";
cout << "配對Soft後用y" << i << " = " << var_1.y_var[i] << endl;
}
cout << "-------------------------------------------------" << endl;
*/
cout << "第 " << ++count_i << "次, 當 x = " << var_1.x_var[0] << " , min y = " << var_1.y_var[0]<< endl;
}
system("PAUSE");
return 0;
}