迷雾少年 发表于 2015-5-16 22:44:17

[纯C][万能一元方程计算器]

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

[修改版在7楼]

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




精度在代码里面 精度越低准确越高 时间越长


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



一元三次
5x^3 + 2x^2 + 3x + 123456 = 888888
这个{:5_92:}

可以提高精度计算准 但时间就X了

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


好了,,,

代码?

老规矩


回复得!{:5_91:}

Visual Stdio 2012 测试通过


<BLOCKQUOTE>#include <stdio.h>
#include <stdlib.h> //要用到system函数
#include <Windows.h>//计算时间用到函数
#define 精度 0.0001 //越小准确越高
#define 范围取值 2 //请自己根据输出值更改 这个值随着精度减少而增大
double 求X次的Y方(double X,double Y)
{
register double R = X;
while (--Y)
{
R = R * X;
}
return R;
}
int main()
{

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

//时间计算
DWORD StartTime = 0;

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

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

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

值 = 0.0;
//开始计算 时间记录
StartTime = GetTickCount();
while (值 <= 等值)
{
值 = 0.0;
for (循环变量 = 1;循环变量<=最高项数;循环变量++)
{
if(!系数数组[循环变量-1]) //当系数是0的时候
{
continue;
}
值 = 值 + 求X次的Y方(X,循环变量) * 系数数组[循环变量-1]; //x^y + 系数
}

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

X += 精度;
}


return 0;
}


















迷雾少年 发表于 2015-5-16 22:49:08

优化神马的不搞了,睡觉了

迷雾少年 发表于 2015-5-16 22:57:37

注视掉输出结果貌似速度能提高不少

牡丹花下死做鬼 发表于 2015-5-17 00:31:38

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

void clean();
int Input(double*a,double*b,double*c);
int check(double a);
void calc(double*a,double*b,double*c,double*d);

int main()
{
        double a,b,c,d;
       
        while(1)
        {
                if(Input(&a,&b,&c))
                {
                        d = b * b - 4 * a * c;
                        calc(&a,&b,&c,&d);
                }
        }
}

void clean()
{
        char ch;
        while((ch = getchar())!='\n');
}

int Input(double*a,double*b,double*c)
{
        printf("aX+bY+c=0\n请输入参数:\n");
        printf("a:");
        scanf("%lf",a);
        if(check(*a))
        {
                return 0;
        }
        printf("b:");
        scanf("%lf",b);
        printf("c:");
        scanf("%lf",c);
        return 1;
}

int check(double a)
{
        if(-0.000001 < a && a < 0.000001)
        {
                printf("a为零就不是个一元二次方程!\n");
                clean();
                return 1;
        }
        return 0;
}
void calc(double*a,double*b,double*c,double*d)
{
        if(*d<0)
        {
                printf("无解!\n");
                clean();
        }
        else if (*d >0.000001)
        {
                printf("X1 = %lf,X2 = %lf\n",(- *b + sqrt(*d))/(2 * *a),(- *b - sqrt(*d))/(2 * *a));
                clean();
        }
        else
        {
                printf("X = %lf\n",(0 - sqrt(*b))/(2 * *a));
                clean();
        }
}

牡丹花下死做鬼 发表于 2015-5-17 00:33:04

我这个是一元二次的一元多次的穷举法←_← 我还是算了吧

迷雾少年 发表于 2015-5-17 07:00:51

牡丹花下死做鬼 发表于 2015-5-17 00:33
我这个是一元二次的一元多次的穷举法←_← 我还是算了吧

一元二次有公式当然快

迷雾少年 发表于 2015-5-17 16:40:58

本帖最后由 迷雾少年 于 2015-5-17 16:41 编辑


输出结果那行删去后 速度提高X^y倍:shock:

#include <stdio.h>
#include <stdlib.h> //要用到system函数
#include <Windows.h>//计算时间用到函数
#define 精度 0.00001//越小准确越高
#define 范围取值 2//请自己根据输出值更改这个值随着精度减少而增大
double求X次的Y方(double X,double Y)
{
      register double R = X;
      while (--Y)
      {
      R = R * X;
      }
      return R;
}
int main()
{
      
      int 最高项数 = NULL,等值 = NULL;
      register int 循环变量 = NULL;
      int 常数项值 = NULL;
      int 系数数组 = {NULL};
      int 次数数组 = {NULL}; //为了处理 x^4= 0这样的处理的
      register double X = 0.1, 值;      //精确到0.1
      
      //时间计算
      DWORD StartTime = 0;
         
      system("title 迷雾少年[一元方程万能计算]");
      printf("请输入方程最高项:");
      scanf_s("%d",&最高项数);
      while((++循环变量) && 循环变量<=最高项数)
      {
                printf("请输入%d的系数:",循环变量);
                scanf("%d",&系数数组[循环变量-1]);
                printf("\n");
      }

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

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

      值 = 0.0;
      //开始计算时间记录
      StartTime = GetTickCount();
      while (值 <= 等值)
      {
                值 = 0.0;
                for (循环变量 = 1;循环变量<=最高项数;循环变量++)
                {
                        if(!系数数组[循环变量-1]) //当系数是0的时候
                        {
                              continue;
                        }
                        值 = 值 + 求X次的Y方(X,循环变量) * 系数数组[循环变量-1];//x^y + 系数
                }

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

                X += 精度;
      }
      printf("%lf\n",值);
      printf("X = %lf   计算精度%lf花费时间:%d",X,精度,GetTickCount()-StartTime);
      return 0;
}

claysystem 发表于 2015-5-17 21:14:41

不错{:1_1:}

mrjliu 发表于 2015-5-21 11:20:58

学习学习,支持支持

mrjliu 发表于 2015-5-21 11:23:11

学习学习,支持支持

mrjliu 发表于 2015-5-21 18:30:41

来下载作品观察一下

迷雾少年 发表于 2015-5-22 16:28:27

mrjliu 发表于 2015-5-21 18:30
来下载作品观察一下

{:9_240:}谢谢

364904690 发表于 2015-5-22 16:41:12

{:5_90:}

citian3094 发表于 2015-5-22 19:29:20

谢谢分享!!!

迷雾少年 发表于 2015-5-22 20:12:21

{:9_240:}谢谢顶帖

桃花飞舞 发表于 2015-5-22 22:41:16

有大神来过,mark一下

vank 发表于 2015-5-26 06:19:29

{:1_1:}

无名侠 发表于 2015-9-3 19:51:55

{:9_230:}楼主的命名方式独特!{:9_240:}

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

我爱软件开发 发表于 2016-4-28 09:38:52

我得好好学习
页: [1]
查看完整版本: [纯C][万能一元方程计算器]