C++ c++;代码检查器的二次方程不能正常工作

C++ c++;代码检查器的二次方程不能正常工作,c++,C++,我正在向我所在大学的测试人员提交代码,我的代码在我提供的测试用例中完全有效 检查器告诉我有一些测试用例无法通过,我正在VisualStudio中测试,这与联机编译器完全兼容 问题描述: 输入:包含3个整数:a,b,c(| a,b,c |我认为默认的cout精度与您的问题不符。请尝试 std::cout << std::setprecision(10); std::cout 示例输出描述如下:输入:1-8 15输出:2 3 5 如果输入为-18-15,则此程序将输出2 5 3,同时要

我正在向我所在大学的测试人员提交代码,我的代码在我提供的测试用例中完全有效

检查器告诉我有一些测试用例无法通过,我正在VisualStudio中测试,这与联机编译器完全兼容

问题描述:
输入:包含3个整数:a,b,c(| a,b,c |我认为默认的cout精度与您的问题不符。请尝试

std::cout << std::setprecision(10);
std::cout
示例输出描述如下:输入:1-8 15输出:2 3 5

如果输入为
-18-15
,则此程序将输出
2 5 3
,同时要求按升序打印这两个解决方案。因此,您需要在打印前对它们进行排序。此外,我会在每个输出语句中添加一个换行符

-编辑-

在不知道所需的确切格式和失败测试的数字的情况下,我们只能推测如何修改发布的程序。不过,一些更改可能是有益的

I/O

没有对输入进行任何检查。在线评委通常会给出定义良好的输入,但您始终可以添加一些测试

cin >> a >> b >> c;
if (!cin)
    cout << "-1\n";
精度和转角情况

在不太可能(给定输入值的范围)遇到精度问题的情况下,您可以选择其他公式(例如)

else if(delta>0)
{
如果(c==0)
{
x1=0.0;
x2=双(-b)/a;
}
其他的
{
如果(b>0)
x1=-0.5*(b+std::sqrt(δ))/a;
其他的
x1=-0.5*(b-std::sqrt(delta))/a;
x2=c/(a*x1);
}
如果(x1>x2)

cout问题可能在于int到double的转换

要调试它,您需要将您的操作分成不同的行,调试器可以停止。例如,表达式
-(c*1.0)
更好地表示为
(double)-c
。它至少使它更清晰,并使用了否定(free)和强制转换(比1.0的乘法更精确[语言上]

例如,您的代码会变成这样:

#include <iostream>
#include <math.h>
using namespace std;
int mainC(int argc , char** argv)
{
    (void)argc;
    (void)argv;

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int a, b, c, delta;

    double x1, x2, x;

    cin >> a >> b >> c;

    delta = ((b*b) - (4 * a * c));

    if (a == 0) {
        if (b != 0) {
///            x = (-(c*1.0) / (b));
            /// separate the operation and avoid multiplication and implicit casts
            x = ((double)-c);
            x /= (double)b;
            cout << 1 << " " << x;
        }
        else
            cout << "-1";
    }
    else
        if (delta > 0)
        {
///            x1 = ((-(b + sqrt(delta))*1.0) / (2 * a));
///            x2 = ((-(b - sqrt(delta))*1.0) / (2 * a));
            /// separate the operation and avoid multiplication and implicit casts
            // discriminant
            const double discrim = sqrt(delta);
            x = (double)-b;
            x1 = x + discrim;
            x2 = x - discrim;
            x1 /= (double)(2*a);
            x2 /= (double)(2*a);
            cout << 2 << " " << x1 << " " << x2;
        }
        else if (delta == 0)
        {
///            x = (-(b*1.0) / (2 * a));
            /// separate the operation and avoid multiplication and implicit casts
            x = (double)-b;
            x /= (double)(2*a);
            cout << 1 << " " << x;
        }
        else
            cout << "-1";
    return 0;
}
#包括
#包括
使用名称空间std;
int mainC(int argc,字符**argv)
{
(无效)argc;
(无效)argv;
freopen(“input.txt”,“r”,stdin);
freopen(“output.txt”,“w”,stdout);
INTA、b、c、δ;
双x1,x2,x;
cin>>a>>b>>c;
δ=((b*b)-(4*a*c));
如果(a==0){
如果(b!=0){
///x=((c*1.0)/(b));
///分离运算并避免乘法和隐式强制转换
x=((双)-c);
x/=(双)b;

如果目标机器支持32位
int
(在实践中相当常见,包括在许多windows框中),您能否至少简单地解释一下代码的作用?和/或提供几个测试用例示例(输入/输出)然后输入
b
100000
的值将导致
b*b
溢出。这将导致未定义的行为-并且,如果有一个测试用例输入了这样的值,那么该测试用例将不会产生所需的结果。我认为您的问题是
delta==0
的情况。您正在输出
1
a正确答案是同一根两次。例如“代码> x^ 2 +2x+ 1=0 < /代码>有一个重复的根<代码> -1 < /代码>,但是你产生<代码> 1 -1 < /代码> PAPA-我不是一个读心术者,在提供它们之前不能知道约束。如果输入包含“代码> 1”/代码>,请考虑“<代码> A < /代码>的值。这是一个积分值,但它将防止<代码> b>代码>和<代码> c>代码>被读取为<代码> int >代码> s。当我回答时不在那里!有人可能会说,在这种情况下正确的答案是
2-1-1
。其他可能性:他们可能希望输出在单独的行上吗?你说“检查程序告诉某些测试用例不能通过”…它是否明确地说某些测试用例确实通过了(在这种情况下,可能是溢出等,对于特定的输入,这就是问题所在)。如果不是,则可能是所有测试用例都失败了(这意味着所有输入都有一个共同点,比如不在单独的行上)。我确实更新了代码,但仍然在测试5失败时停止。@Bon除了您这样做之外,还有其他方法可以打印0而不是-0。@Papa好吧,您可以始终使用普通的
if
而不是条件运算符。如果这是问题。我编辑了打印0而不是-0的代码,仍然无法通过测试5,我的意思与t相同他是你给的。@Papa如果是精度问题或格式问题,双解问题或是一些特殊情况,那么知道这个测试是关于什么会有帮助的。没有任何进一步的数据,我们(至少是我)真的帮不了忙。请给我们作业的确切措辞。这是格式:输入:包含3个整数:a,b,c(| a,b,c |如果改变x1和x2的输出顺序不起作用(使用我的代码),那么他们没有给我们提供足够的信息。我的代码应该可以工作,除了按升序输出两个,但这是一个小修正。
cin >> a >> b >> c;
if (!cin)
    cout << "-1\n";
if (a == 0)
{
    if (b != 0)
    {
        if ( c == 0 )
            x = 0.0;
        else
            x = double(-c) / b;

        cout << "1 " << x << '\n';
    }
    else
        cout << "-1\n";
}
else if (delta > 0)
{
    if ( c == 0 )
    {
        x1 = 0.0;
        x2 = double(-b) / a;
    }
    else
    {
        if ( b > 0 )
            x1 = -0.5 * (b + std::sqrt(delta)) / a;
        else
            x1 = -0.5 * (b - std::sqrt(delta)) / a;
        x2 = c / (a * x1);
    }

    if (x1 > x2)
        cout << "2 " << x2 << " " << x1 << '\n';
    else
        cout << "2 " << x1 << " " << x2 << '\n';
}
else if (delta == 0)
{
    if ( b == 0 )
        x = 0.0;
    else
        x = -0.5 * b / a;

    cout << "1 " << x << '\n';
    // Assuming they don't require ("all the roots")
    // cout << "2 " << x << ' ' << x << '\n';
}
#include <iostream>
#include <math.h>
using namespace std;
int mainC(int argc , char** argv)
{
    (void)argc;
    (void)argv;

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int a, b, c, delta;

    double x1, x2, x;

    cin >> a >> b >> c;

    delta = ((b*b) - (4 * a * c));

    if (a == 0) {
        if (b != 0) {
///            x = (-(c*1.0) / (b));
            /// separate the operation and avoid multiplication and implicit casts
            x = ((double)-c);
            x /= (double)b;
            cout << 1 << " " << x;
        }
        else
            cout << "-1";
    }
    else
        if (delta > 0)
        {
///            x1 = ((-(b + sqrt(delta))*1.0) / (2 * a));
///            x2 = ((-(b - sqrt(delta))*1.0) / (2 * a));
            /// separate the operation and avoid multiplication and implicit casts
            // discriminant
            const double discrim = sqrt(delta);
            x = (double)-b;
            x1 = x + discrim;
            x2 = x - discrim;
            x1 /= (double)(2*a);
            x2 /= (double)(2*a);
            cout << 2 << " " << x1 << " " << x2;
        }
        else if (delta == 0)
        {
///            x = (-(b*1.0) / (2 * a));
            /// separate the operation and avoid multiplication and implicit casts
            x = (double)-b;
            x /= (double)(2*a);
            cout << 1 << " " << x;
        }
        else
            cout << "-1";
    return 0;
}