鱼C论坛

 找回密码
 立即注册
查看: 3225|回复: 18

[技术交流] [纯C][万能一元方程计算器]

[复制链接]
发表于 2015-5-16 22:44:17 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 迷雾少年 于 2015-5-22 20:13 编辑

[修改版在7楼]

例子
一元一次方程
3x  = 100

1.png
2.png
3.png
精度在代码里面 精度越低准确越高 时间越长


一元二次
1x^2 + 2x  + 20 = 1000

4.png

一元三次
5x^3 + 2x^2 + 3x + 123456 = 888888
这个
6.png
可以提高精度计算准 但时间就X了

一元6次
x^6 + x^5 + x^4 + x^3 + x^2 + x = 8888
7.png

好了  ,,,

代码?

老规矩


回复得!

Visual Stdio 2012 测试通过

  1. [hide]
  2. <BLOCKQUOTE>#include <stdio.h>
  3. #include <stdlib.h> //要用到system函数
  4. #include <Windows.h>//计算时间用到函数
  5. #define 精度 0.0001 //越小准确越高
  6. #define 范围取值 2 //请自己根据输出值更改 这个值随着精度减少而增大
  7. double 求X次的Y方(double X,double Y)
  8. {
  9. register double R = X;
  10. while (--Y)
  11. {
  12. R = R * X;
  13. }
  14. return R;
  15. }
  16. int main()
  17. {

  18. int 最高项数 = NULL,等值 = NULL;
  19. register int 循环变量 = NULL;
  20. int 常数项值 = NULL;
  21. int 系数数组[10] = {NULL};
  22. int 次数数组[10] = {NULL}; //为了处理 x^4 = 0 这样的处理的
  23. register double X = 0.1, 值; //精确到0.1

  24. //时间计算
  25. DWORD StartTime = 0;

  26. system("title 迷雾少年[一元方程万能计算]");
  27. printf("请输入方程最高项:");
  28. scanf_s("%d",&最高项数);
  29. while((++循环变量) && 循环变量<=最高项数)
  30. {
  31. printf("请输入%d的系数:",循环变量);
  32. scanf("%d",&系数数组[循环变量-1]);
  33. printf("\n");
  34. }

  35. printf("请输入常数项:");
  36. scanf_s("%d",&常数项值);

  37. printf("\n请输入右边等值:");
  38. scanf_s("%d",&等值);

  39. 值 = 0.0;
  40. //开始计算 时间记录
  41. StartTime = GetTickCount();
  42. while (值 <= 等值)
  43. {
  44. 值 = 0.0;
  45. for (循环变量 = 1;循环变量<=最高项数;循环变量++)
  46. {
  47. if(!系数数组[循环变量-1]) //当系数是0的时候
  48. {
  49. continue;
  50. }
  51. 值 = 值 + 求X次的Y方(X,循环变量) * 系数数组[循环变量-1]; //x^y + 系数
  52. }

  53. 值 += 常数项值;
  54. printf("%lf\n",值);
  55. if((值>=等值-范围取值) && (值<=等值+范围取值)) //里面的100
  56. {
  57. printf("亲! 大概的解是%lf\n",X);
  58. printf("计算精度%lf 花费时间:%d",精度,GetTickCount()-StartTime);
  59. return 0;
  60. }

  61. X += 精度;
  62. }


  63. return 0;
  64. }
复制代码



















评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +4 收起 理由
拈花小仙 + 5 + 5 + 4 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-5-16 22:49:08 | 显示全部楼层
优化神马的不搞了,睡觉了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-16 22:57:37 From FishC Mobile | 显示全部楼层
注视掉输出结果貌似速度能提高不少
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-17 00:31:38 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<math.h>

  3. void clean();
  4. int Input(double*a,double*b,double*c);
  5. int check(double a);
  6. void calc(double*a,double*b,double*c,double*d);

  7. int main()
  8. {
  9.         double a,b,c,d;
  10.        
  11.         while(1)
  12.         {
  13.                 if(Input(&a,&b,&c))
  14.                 {
  15.                         d = b * b - 4 * a * c;
  16.                         calc(&a,&b,&c,&d);
  17.                 }
  18.         }
  19. }

  20. void clean()
  21. {
  22.         char ch;
  23.         while((ch = getchar())!='\n');
  24. }

  25. int Input(double*a,double*b,double*c)
  26. {
  27.         printf("aX+bY+c=0\n请输入参数:\n");
  28.         printf("a:");
  29.         scanf("%lf",a);
  30.         if(check(*a))
  31.         {
  32.                 return 0;
  33.         }
  34.         printf("b:");
  35.         scanf("%lf",b);
  36.         printf("c:");
  37.         scanf("%lf",c);
  38.         return 1;
  39. }

  40. int check(double a)
  41. {
  42.         if(-0.000001 < a && a < 0.000001)
  43.         {
  44.                 printf("a为零就不是个一元二次方程!\n");
  45.                 clean();
  46.                 return 1;
  47.         }
  48.         return 0;
  49. }
  50. void calc(double*a,double*b,double*c,double*d)
  51. {
  52.         if(*d<0)
  53.         {
  54.                 printf("无解!\n");
  55.                 clean();
  56.         }
  57.         else if (*d >0.000001)
  58.         {
  59.                 printf("X1 = %lf,X2 = %lf\n",(- *b + sqrt(*d))/(2 * *a),(- *b - sqrt(*d))/(2 * *a));
  60.                 clean();
  61.         }
  62.         else
  63.         {
  64.                 printf("X = %lf\n",(0 - sqrt(*b))/(2 * *a));
  65.                 clean();
  66.         }
  67. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-17 00:33:04 | 显示全部楼层
我这个是一元二次的  一元多次的穷举法←_← 我还是算了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-17 07:00:51 | 显示全部楼层
牡丹花下死做鬼 发表于 2015-5-17 00:33
我这个是一元二次的  一元多次的穷举法←_← 我还是算了吧

一元二次有公式当然快
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-17 16:40:58 | 显示全部楼层
本帖最后由 迷雾少年 于 2015-5-17 16:41 编辑

QQ图片20150517163841.jpg
输出结果那行删去后 速度提高X^y倍:shock:

  1. #include <stdio.h>
  2. #include <stdlib.h> //要用到system函数
  3. #include <Windows.h>//计算时间用到函数
  4. #define 精度 0.00001  //越小准确越高
  5. #define 范围取值 2  //请自己根据输出值更改  这个值随着精度减少而增大
  6. double  求X次的Y方(double X,double Y)
  7. {
  8.         register double R = X;
  9.         while (--Y)
  10.         {
  11.       R = R * X;
  12.         }
  13.         return R;
  14. }
  15. int main()
  16. {
  17.         
  18.         int 最高项数 = NULL,等值 = NULL;
  19.         register int 循环变量 = NULL;
  20.         int 常数项值 = NULL;
  21.         int 系数数组[10] = {NULL};
  22.         int 次数数组[10] = {NULL}; //为了处理 x^4  = 0  这样的处理的
  23.         register double X = 0.1, 值;      //精确到0.1
  24.         
  25.         //时间计算
  26.         DWORD StartTime = 0;
  27.          
  28.         system("title 迷雾少年[一元方程万能计算]");
  29.         printf("请输入方程最高项:");
  30.         scanf_s("%d",&最高项数);
  31.         while((++循环变量) && 循环变量<=最高项数)
  32.         {
  33.                 printf("请输入%d的系数:",循环变量);
  34.                 scanf("%d",&系数数组[循环变量-1]);
  35.                 printf("\n");
  36.         }

  37.         printf("请输入常数项:");
  38.         scanf_s("%d",&常数项值);

  39.         printf("\n请输入右边等值:");
  40.         scanf_s("%d",&等值);

  41.         值 = 0.0;
  42.         //开始计算  时间记录
  43.         StartTime = GetTickCount();
  44.         while (值 <= 等值)
  45.         {
  46.                 值 = 0.0;
  47.                 for (循环变量 = 1;循环变量<=最高项数;循环变量++)
  48.                 {
  49.                         if(!系数数组[循环变量-1]) //当系数是0的时候
  50.                         {
  51.                                 continue;
  52.                         }
  53.                         值 = 值 + 求X次的Y方(X,循环变量) * 系数数组[循环变量-1];  //x^y + 系数
  54.                 }

  55.                 值 +=  常数项值;
  56.                
  57.                 if((值>=等值-范围取值) && (值<=等值+范围取值)) //里面的100
  58.                 {
  59.                         printf("亲! 大概的解是%lf\n",X);
  60.                         printf("计算精度%lf  花费时间:%d",精度,GetTickCount()-StartTime);
  61.                         return 0;
  62.                 }

  63.                 X += 精度;
  64.         }
  65.         printf("%lf\n",值);
  66.         printf("X = %lf   计算精度%lf  花费时间:%d",X,精度,GetTickCount()-StartTime);
  67.         return 0;
  68. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-17 21:14:41 | 显示全部楼层
不错{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-5-21 11:20:58 | 显示全部楼层
学习学习,支持支持
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-21 11:23:11 | 显示全部楼层
学习学习,支持支持
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-21 18:30:41 | 显示全部楼层
来下载作品观察一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-22 16:28:27 | 显示全部楼层
mrjliu 发表于 2015-5-21 18:30
来下载作品观察一下

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

使用道具 举报

发表于 2015-5-22 16:41:12 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-5-22 19:29:20 | 显示全部楼层
谢谢分享!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-22 20:12:21 | 显示全部楼层
谢谢顶帖
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-22 22:41:16 | 显示全部楼层
有大神来过,mark一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-5-26 06:19:29 | 显示全部楼层
{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-9-3 19:51:55 | 显示全部楼层
楼主的命名方式独特!

穷举法真是太强大了...不过我觉得你能把小数用分数表示的话精度应该更高!

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

使用道具 举报

发表于 2016-4-28 09:38:52 | 显示全部楼层
我得好好学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-22 10:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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