有形如:ax3+bx2+cx+d=0 這樣的一個一元三次方程。給出該方程中各項的係數(a,b,c,d 均爲實數),並約定該方程存在三個不同實根(根的範圍在-100至100之間),且根與根之差的絕對值>=1。要求由小到大依次在同一行輸出這三個實根(根與根之間留有空格),並精確到小數點後2位。
提示:記方程f(x)=0,若存在2個數x1和x2,且x1<x2,f(x1)*f(x2)<0,則在(x1,x2)之間一定有一個 根。
樣例
輸入:1 -5 -4 20
輸出:-2.00 2.00 5.00
【分析】
由於精度不大,直接枚舉即可。
以下代碼參考了BYVoid(http://www.byvoid.com)的代碼~他的代碼比我的簡練多了~
【代碼】
01 //NOIP2001 一元三次方程求解
02 #include <cstdio>
03 #include <iostream>
04 using namespace std;
05 int main()
06 {
07 double a,b,c,d,x,v;
08 int X;
09 freopen("3cfc.in","r",stdin);
10 freopen("3cfc.out","w",stdout);
11 cin>>a>>b>>c>>d;
12 for (X=-10000;X<=10000;x=(++X)/100.0)
13 {
14 v=a*x*x*x+b*x*x+c*x+d;
15 if (v>=-0.01 && v<=0.01)
16 printf("%.2lf ",x);
17 }
18 return 0;
19 }
正在连接评测机...02 #include <cstdio>
03 #include <iostream>
04 using namespace std;
05 int main()
06 {
07 double a,b,c,d,x,v;
08 int X;
09 freopen("3cfc.in","r",stdin);
10 freopen("3cfc.out","w",stdout);
11 cin>>a>>b>>c>>d;
12 for (X=-10000;X<=10000;x=(++X)/100.0)
13 {
14 v=a*x*x*x+b*x*x+c*x+d;
15 if (v>=-0.01 && v<=0.01)
16 printf("%.2lf ",x);
17 }
18 return 0;
19 }
已连接到评测机
GRID | 1 |
名称 | Flitty |
系统版本 | 1.00 |
备注 | COGS 1号评测机 Flitty |
编译成功
测试点 | 结果 | 得分 | 运行时间 | 内存使用 | 退出代码 |
1 | 正确 | 20 | 0.027 s | 273 KB | 0 |
2 | 正确 | 20 | 0.001 s | 273 KB | 0 |
3 | 正确 | 20 | 0.001 s | 273 KB | 0 |
4 | 正确 | 20 | 0.001 s | 273 KB | 0 |
5 | 正确 | 20 | 0.001 s | 273 KB | 0 |
运行时间 0.031 s
平均内存使用 273 KB
测试点通过状况 AAAAA
得分:100
恭喜你通过了全部测试点!
沒有留言:
張貼留言