鱼C论坛

 找回密码
 立即注册
查看: 1285|回复: 4

[已解决]一元二次方程系数过大无法计算(可约分)怎么解决呢?

[复制链接]
发表于 2024-2-28 22:27:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
具体问题描述如图。
目前代码如下。
用的是c语言。


#include <stdio.h>
#include "math.h"
int main()
{
        double a, b, c, d, x1, x2,e = 1e-10 ;
        printf("请输入a,b,c,代入f(x)=ax2+bx+c中:");
        scanf("%lf%lf%lf",&a,&b,&c);
       
        if
        printf("%lf",b);
        if(fabs(a)<e){
                x1 = -c/b;
                printf("方程有一个根,为%lf",x1);
        }
        else{
                d = b*b-4*a*c;
                if(d<e){
                        printf("该方程无解。");
                }
                else if(fabs(d)<e){
                        x1 = x2 = -b/(2*a);
                        printf("该方程有两个相等的解x1=x2=%lf",x1,x2);
                }
                else{
                        d = sqrt(d) ;
                        x1 = (-b+d)/(2*a) ;
                        x2 = (-b-d)/(2*a) ;
                        printf("该方程有两个解,x1=%lf,x2=%lf",x1,x2);
                }
        }

    return 0;
}
最佳答案
2024-2-29 08:49:16
鱼油代码中的逻辑是正确的方向,但是有一些部分似乎是不完整滴~

特别是:

if 语句后面直接跟着 printf

同时需要处理判断式 fabs(d) < e 的情况,这里用于判断判别式是否接近于0,意味着两个根相等。

去修正这些地方:

  • 1. 在进行 fabs(a) < e 判断时,应该考虑 b 也接近于0的情况,否则会导致除以 0 的情况。
  • 2. 在判断 d < e 时,应该比较 d < 0 来确定方程是否无解,因为当判别式小于0时,方程没有实数解。
  • 3. 在比较 fabs(d) < e 时,应该确认 d 是否接近0来判断方程是否有两个相等的实数解。

以下是修正后的代码段,以更正这些问题:

  1. //... 省略了部分代码
  2. if(fabs(a) < e){
  3.     if(fabs(b) < e) {
  4.         printf("该方程无解。");
  5.     } else {
  6.         x1 = -c/b;
  7.         printf("方程有一个根,为%lf", x1);
  8.     }
  9. } else {
  10.     d = b*b - 4*a*c;
  11.     if(d < -e){
  12.         printf("该方程无解。");
  13.     } else if(fabs(d) < e){
  14.         x1 = -b / (2*a);
  15.         printf("该方程有两个相等的解x1=x2=%lf", x1);
  16.     } else {
  17.         d = sqrt(d);
  18.         x1 = (-b + d) / (2*a);
  19.         x2 = (-b - d) / (2*a);
  20.         printf("该方程有两个解,x1=%lf,x2=%lf", x1, x2);
  21.     }
  22. }
复制代码

拿走不谢
一元二次方程求助.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-2-28 22:27:40 | 显示全部楼层
一元二次方程系数过大无法计算,可能是由于数值溢出导致的。你可以考虑进行约分操作,将系数缩小到可以处理的范围内。

具体操作如下:

1. 首先判断a是否为0,如果是,则方程不是二次方程,而是一次方程,直接求解即可。

2. 如果a不为0,就需要进行约分操作。找到a、b、c的最大公约数g,然后将a、b、c都除以g来进行约分。

3. 约分之后,再进行求解一元二次方程。

下面是修改后的代码示例:

  1. #include <stdio.h>
  2. #include <math.h>

  3. // 求两个数的最大公约数
  4. int gcd(int a, int b)
  5. {
  6.     if (b == 0)
  7.         return a;
  8.     else
  9.         return gcd(b, a % b);
  10. }

  11. int main()
  12. {
  13.     double a, b, c;
  14.     printf("请输入a, b, c,代入f(x) = ax^2 + bx + c中:");
  15.     scanf("%lf%lf%lf", &a, &b, &c);

  16.     // 判断a是否为0
  17.     if (a == 0)
  18.     {
  19.         double x;
  20.         x = -c / b;
  21.         printf("方程的解为 x = %lf\n", x);
  22.     }
  23.     else
  24.     {
  25.         int g = gcd((int)a, (int)b);
  26.         g = gcd(g, (int)c);

  27.         a = a / g;
  28.         b = b / g;
  29.         c = c / g;

  30.         double delta = b * b - 4 * a * c;

  31.         // 判断delta的值
  32.         if (delta > 0)
  33.         {
  34.             double x1 = (-b + sqrt(delta)) / (2 * a);
  35.             double x2 = (-b - sqrt(delta)) / (2 * a);
  36.             printf("方程的解为 x1 = %lf, x2 = %lf\n", x1, x2);
  37.         }
  38.         else if (fabs(delta) < 1e-10)
  39.         {
  40.             double x = -b / (2 * a);
  41.             printf("方程的解为 x = %lf\n", x);
  42.         }
  43.         else
  44.         {
  45.             printf("方程无实数解\n");
  46.         }
  47.     }

  48.     return 0;
  49. }
复制代码


在上述代码中,首先定义了一个最大公约数的函数`gcd`,然后根据a是否为0来判断方程是一次方程还是二次方程,再进行约分操作。最后根据delta的值判断方程的解,并输出结果。

希望能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-29 08:49:16 | 显示全部楼层    本楼为最佳答案   
鱼油代码中的逻辑是正确的方向,但是有一些部分似乎是不完整滴~

特别是:

if 语句后面直接跟着 printf

同时需要处理判断式 fabs(d) < e 的情况,这里用于判断判别式是否接近于0,意味着两个根相等。

去修正这些地方:

  • 1. 在进行 fabs(a) < e 判断时,应该考虑 b 也接近于0的情况,否则会导致除以 0 的情况。
  • 2. 在判断 d < e 时,应该比较 d < 0 来确定方程是否无解,因为当判别式小于0时,方程没有实数解。
  • 3. 在比较 fabs(d) < e 时,应该确认 d 是否接近0来判断方程是否有两个相等的实数解。

以下是修正后的代码段,以更正这些问题:

  1. //... 省略了部分代码
  2. if(fabs(a) < e){
  3.     if(fabs(b) < e) {
  4.         printf("该方程无解。");
  5.     } else {
  6.         x1 = -c/b;
  7.         printf("方程有一个根,为%lf", x1);
  8.     }
  9. } else {
  10.     d = b*b - 4*a*c;
  11.     if(d < -e){
  12.         printf("该方程无解。");
  13.     } else if(fabs(d) < e){
  14.         x1 = -b / (2*a);
  15.         printf("该方程有两个相等的解x1=x2=%lf", x1);
  16.     } else {
  17.         d = sqrt(d);
  18.         x1 = (-b + d) / (2*a);
  19.         x2 = (-b - d) / (2*a);
  20.         printf("该方程有两个解,x1=%lf,x2=%lf", x1, x2);
  21.     }
  22. }
复制代码

拿走不谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-29 20:16:21 | 显示全部楼层
不二如是 发表于 2024-2-29 08:49
鱼油代码中的逻辑是正确的方向,但是有一些部分似乎是不完整滴~

特别是:

谢谢友友的完善,请问我这道题数据中给的第一个数据a=6*10^154次幂这个最后结果输出不了,怎么办呀!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-29 20:17:10 | 显示全部楼层
不二如是 发表于 2024-2-29 08:49
鱼油代码中的逻辑是正确的方向,但是有一些部分似乎是不完整滴~

特别是:

是按照上面AI的方法就可以改正了嘛?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 20:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表