[纯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;
}
优化神马的不搞了,睡觉了 注视掉输出结果貌似速度能提高不少 #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
我这个是一元二次的一元多次的穷举法←_← 我还是算了吧
一元二次有公式当然快 本帖最后由 迷雾少年 于 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;
} 不错{:1_1:} 学习学习,支持支持 学习学习,支持支持 来下载作品观察一下 mrjliu 发表于 2015-5-21 18:30
来下载作品观察一下
{:9_240:}谢谢 {:5_90:} 谢谢分享!!! {:9_240:}谢谢顶帖 有大神来过,mark一下 {:1_1:} {:9_230:}楼主的命名方式独特!{:9_240:}
穷举法真是太强大了...不过我觉得你能把小数用分数表示的话精度应该更高!
我得好好学习
页:
[1]