0

我正在从 ACM Uva 网页上解决这个问题,并且我已经尝试了来自论坛的每一个输入,并且效果很好。它一直给我“错误的答案”,而且由于我不是说英语的人,也许我忘记了一些东西。也许这里有人提交了这个解决方案。这是我从这个问题中提交的第 5 次提交,而且总是错误的。非常感谢。编辑:

求解方程:

p*ex + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0

其中 0 <= x <= 1。

输入

输入由多个测试用例组成,并由 EOF 终止。每个测试用例在一行中包含 6 个整数:p、q、r、s、t 和 u(其中 0 <= p,r <= 20 和 -20 <= q,s,t <= 0)。输入文件中最多有 2100 行。

输出

对于每组输入,应该有一行包含 x 的值,正确至小数点后 4 位,或字符串“No solution”,以适用者为准。

#include <math.h>
#include <stdio.h>
#define eps 0.00001

int p, q, r,s,t,u;

long double fdex(long double x)
{
long double res=p*exp(-x)+ q*sin(x)+r*cos(x)+s*tan(x)+t*x*x+u;

return res;


}



int main()
{
freopen("input.txt","rt",stdin);
freopen("output.txt","wt",stdout);


long double x,inf,sup,fx;
while(scanf("%d %d %d %d %d %d\n",&p, &q, &r,&s,&t,&u)!=EOF)
{
    long double x1;
    inf=0.0;
    sup=1.0;
    if (p==0 && q==0 && r==0 && s==0 && t==0)
    printf("0.0000\n");
    else if((fdex(inf)*fdex(sup)>0.0))
    printf("No solution\n");

        else 
        {


                do
                {
                    x=(inf+sup)/2.0;
                    fx=fdex(x);
                        if(fx>eps)
                        {
                        inf=x;
                        }
                        else if(fx<-eps)
                        {
                        sup=x;

                        }

                }while( fx<-eps || fx>eps);
                printf("%.4llf\n",x);

        }
}


}

问题

4

5 回答 5

1

要尝试/考虑的一些事情:

  1. printf("%.4llf\n",x);会将答案四舍五入到小数点后 4 位,因此1.23456将变为1.2346. 如果这是您期望做的事情,问题尚不清楚 - 它可能需要前 4 位小数而不四舍五入;
  2. jrok在评论中说

    如果输出需要成行输入,那么像输入末尾多余的空行这样愚蠢的东西可以使您在 Uva 上提交 WA。例如 for (int i = 0; i < ARRAYSIZE; ++i) cout << arr[i] << '\n'; 可能不起作用。您需要额外检查以在最后一行之后不打印 '\n'。愚蠢的IMO,但事实就是这样......

    就我个人而言,我从未在 UVA 上经历过这种情况,但我在那里不是很活跃,所以你可能想检查一下。

  3. 不要使用scanf(..) != EOF. scanf返回成功读取值的数量,所以你应该这样做scanf(...) == 6

于 2012-09-02T17:35:47.137 回答
0

使 eps 变小有帮助吗?

我担心使用当前的 0.00001 可能无法完全准确地找到根以正确到 4 个有效数字。

于 2012-09-02T19:18:28.670 回答
0

一种可能性是您忘记了 p=q=r=s=t=0,但 u != 0 的情况。

此外,long double 的 printf 修饰符是 L,而不是 ll。

于 2012-09-03T14:50:47.707 回答
0

错误在于:

else if((fdex(inf)*fdex(sup)>0.0))
    printf("No solution\n");

我相信这个 fn 正在减少,所以替换将是:

x = sup;
else if((fdex(x)>0.0)&& (x==1))
    printf("No solution\n");
于 2013-11-09T22:51:46.293 回答
0

您将 x 上的二进制搜索(超过 10,000 个可能值:0.0000 到 1.0000)与 f(x) 上的二进制搜索混淆了:仅仅因为 f(x) 非常接近 0 并不意味着 f(x + 0.0001) 是不接近 0。

于 2018-10-25T22:36:57.610 回答