鱼C论坛

 找回密码
 立即注册
查看: 2869|回复: 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 测试通过
[hide] 
<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 系数数组[10] = {NULL};
int 次数数组[10] = {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;
}


















评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-5-16 22:49:08 | 显示全部楼层
优化神马的不搞了,睡觉了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-16 22:57:37 From FishC Mobile | 显示全部楼层
注视掉输出结果貌似速度能提高不少
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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();
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-17 00:33:04 | 显示全部楼层
我这个是一元二次的  一元多次的穷举法←_← 我还是算了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

一元二次有公式当然快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

QQ图片20150517163841.jpg
输出结果那行删去后 速度提高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 系数数组[10] = {NULL};
        int 次数数组[10] = {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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-17 21:14:41 | 显示全部楼层
不错{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-21 11:20:58 | 显示全部楼层
学习学习,支持支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-21 11:23:11 | 显示全部楼层
学习学习,支持支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-21 18:30:41 | 显示全部楼层
来下载作品观察一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-22 16:41:12 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-22 19:29:20 | 显示全部楼层
谢谢分享!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-22 20:12:21 | 显示全部楼层
谢谢顶帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-22 22:41:16 | 显示全部楼层
有大神来过,mark一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-5-26 06:19:29 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-28 09:38:52 | 显示全部楼层
我得好好学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 00:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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