十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
思路:
网站建设公司,为您提供网站建设,网站制作,网页设计及定制网站建设服务,专注于成都企业网站定制,高端网页制作,对成都宣传片制作等多个行业拥有丰富的网站建设经验的网站建设公司。专业网站设计,网站优化推广哪家好,专业seo优化排名优化,H5建站,响应式网站。
因为这是个加法的多项式,用变量s累加,s的最初值是0,第1次向上加1!,第2次加2!,...,第n磁加n! s+=jc;阶乘变量jc在循环中计算。
每项用循环变量i控制,第1次循环取值1,第2次循环取值2,...,第20次循环取值20,这个变量就是要求的阶乘数,i的值每次加1
阶乘是个累乘的运算,用变量jc,初始值是1,第1次向上乘以循环变量值1,就是1!,第2次是前边计算好的1!*2=2!,...,第20次就是19!*20=20!,jc*=i;
由于20!数据比较大,对于32bit的int型变量存放不下,可以考虑用double型数据计算,省得溢出。
因此程序主体算法为:
int i;
double s,jc;
s=0; jc=1;
for ( i=1;i=20;i++ ) { jc*=i; s+=jc; }
printf("%lf\n",s);
double PostCalculate::calculate(std::string *p,int size)
{
std::stackstring a;
std::string postExp[20];
int count=0; //对 后缀表达式 计数
for(int i=0;isize;i++)
{
if(!isSign(p)) //若不是符号 ,即为数字
{
postExp[count]=*p; //将数字直接放入后缀表达式
count++;
}
else if(*p=="+" ||*p=="-")
{
while(!a.empty() a.top()!="(") //弹出栈中元素直到 栈空 或者 左括号
{
postExp[count]=a.top();
count++;
a.pop();
}
a.push(*p); //将当前元素压栈
}
else if(*p=="*" || *p=="/")
{
while(!a.empty() a.top()!="(" a.top()!="+" a.top()!="-")
{
postExp[count]=a.top();
count++;
a.pop();
}
a.push(*p);
}
else if(*p=="(")
{
a.push(*p);
}
else if(*p==")")
{
while(!a.empty() a.top()!="(")
{
postExp[count]=a.top();
count++;
a.pop();
}
if(!a.empty() a.top()=="(")
a.pop();
}
p++;
}
while(!a.empty())
{
postExp[count++]=a.top();
a.pop();
}
double result=postCal(postExp,count);
return result;
}
std::string PostCalculate::dispose(std::string first, std::string second, std::string op)
{
stringstream t;
double r;
double a=stringToDouble(first);
double b=stringToDouble(second);
if(op=="+")
r=a+b;
else if(op=="-")
r=a-b;
else if(op=="*")
r=a*b;
else if(op=="/")
r=a/b;
tr;
return t.str();
}
double PostCalculate::postCal(std::string *p,int size)
{
std::stackstring res;
for(int i=0;isize;i++)
{
if(!isSign(p)) //遇到数字 压栈
res.push(*p);
else //遇到符号
{
string f=res.top(); //取第2操作数
res.pop();
string s=res.top();//取第1操作数
string r=dispose(s,f,*p);
res.push(r);
}
p++;
}
return stringToDouble(res.top());
}
inline bool PostCalculate::isSign(std::string* s)
{
return (*s=="+"|| *s=="-"|| *s=="*"|| *s=="/"|| *s=="("|| *s==")");
}
inline double PostCalculate::stringToDouble(std::string c) //通过流 实现转换 String - Double
{
double temp;
stringstream a;
a.str(c);
atemp;
return temp;
}
栈的运用…建立两个栈一个存数字一个存运算符…然后取出运算符然后比较优先级…就是这个的思路…求采纳……
应该是计算机上浮点数导致的吧。因为浮点数比较跟整数比较不一致的。
#include
stdio.h
double
polynomial(double
x)
{
return
4*x*x*x
-
x*x
+
7;
}
const
double
EPS=1e-5;
main()
{
double
x,
minx=1,
maxx=2,
step=0.1;
for(x
=
minx;
x
maxx+EPS;
x+=step)
{
printf("polynomial(%.2f)
=
%.2f\n",
x,
polynomial(x));
}
}
C:\test.exe
polynomial(1.00)
=
10.00
polynomial(1.10)
=
11.11
polynomial(1.20)
=
12.47
polynomial(1.30)
=
14.10
polynomial(1.40)
=
16.02
polynomial(1.50)
=
18.25
polynomial(1.60)
=
20.82
polynomial(1.70)
=
23.76
polynomial(1.80)
=
27.09
polynomial(1.90)
=
30.83
polynomial(2.00)
=
35.00
#include
int main(void)
{
int n;
int i,j;
float sum = 1.0;
float dex = 1.0;
printf("输入一个数:");
scanf("%d",n);
for (i = 2; i 0; --j)
{
dex*=j;
}
sum+=1/dex;
dex = 1.0;
}
printf("%.2f\n",sum);
return 0;
}