📄 0_618.cpp
字号:
#include <iostream>
#include <string>
#include <ctype.h>
#include <stack>
#include <stdlib.h>
using namespace std;
int transnum(char a)
{
switch (a)
{
case'0':return 0;
case'1':return 1;
case'2':return 2;
case'3':return 3;
case'4':return 4;
case'5':return 5;
case'6':return 6;
case'7':return 7;
case'8':return 8;
case'9':return 9;
default :return -1;
}
}
float fx(string str,float t)
{
int num=0;
float fx=0;
int ip=0;
string opexp;
stack<int> mystack;
float sum1=0;
while(ip!=str.length())
{
float mul=t;
if(isdigit(str[ip]))
{
int tempip=ip;
sum1=transnum(str[ip]);
while(isdigit(str[ip+1]))
{
sum1=sum1*10+transnum(str[++ip]);
num++;
}
if((!isdigit(str[ip+1]))&&(ip+1<str.length())&&(str[ip+1]!='+')&&(str[ip+1]!='-'))
mystack.push(sum1);
if(str[tempip-1]=='^'&&str[ip-num-4]=='+')
{
for (int i=1;i<sum1;i++)
{
mul=mul*t;
}
fx=mystack.top()*mul+fx;
mystack.pop();
num=0;
}
else if (str[tempip-1]=='^'&&str[ip-num-4]=='-')
{
float result=sum1*mystack.top();
for (int i=1;i<sum1;i++)
{
mul=mul*t;
}
fx=fx-mystack.top()*mul;
mystack.pop();
num=0;
}
else if (!isalpha(str[ip+1])&&str[tempip-1]=='+')
{
fx=fx+sum1;
}
else if (!isalpha(str[ip+1])&&str[tempip-1]=='-')
{
fx=fx-sum1;
}
}
ip++;
}
// cout<<fx<<endl;
return fx;
}
void main()
{
string exp;
float a=0.5,b=3.5;
float f1,f2;
float t1,t2;
float E=0.8;
int k=0;
exp="-2x^3+21x^2-60x^1+50";
t1=b-0.618*(b-a);
t2=a+0.618*(b-a);
f1=fx(exp,t1);f2=fx(exp,t2);
cout<<"the result is:"<<endl;
while (1)
{
k++;
if (f1<=f2)
{
if (t2-a<=E)
{
f1=fx(exp,t1);
cout<<"t1="<<t1;
cout<<"\tf1="<<f1<<endl;
break;
}
else
{
b=t2;
t2=t1;
t1=b-0.618*(b-a);
f2=f1;
f1=fx(exp,t1);
}
}else
{
if (b-t1<=E)
{
f2=fx(exp,t2);
cout<<"t2="<<t2;
cout<<"\tf2="<<f2<<endl;
break;
}
else
{
a=t1;
t1=t2;
t2=a+0.618*(b-a);
f1=f2;
f2=fx(exp,t2);
}
}
}
cout<<"k="<<k<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -