c语言编程求助!解决了再加分!

本小白编写了一个解2元一次方程的程序,如下:
#include<stdio.h>
float max (float a,float b)
{
if (a>b) return a;
else return b;
}
void float_out(float f[])
{
for (int i=2;i<=max(f[0],f[1]);i++)
if ((int)f[0]%i==0&&(int)f[1]%i==0) {f[0]/=i;f[1]/=i;}
printf ("%f/%f",f[0],f[1]);
}
int main ()
{
float a,b,c,d,e,f,x[2],y[2];
scanf ("%fx+%fy=%f\n%fx+%fy=%f",&a,&b,&c,&d,&e,&f);
x[0]=(b*f-e*c);x[1]=(d*b-a*e);
y[0]=(a*f-d*c);y[1]=(a*e-d*b);
printf("x=");
if (x[0]/x[1]!=((int)(x[0]/x[1])))float_out(x);
else printf("%.0f",x[0]/x[1]);
printf("\n");
printf("y=");
if (y[0]/y[1]!=((int)(y[0]/y[1])))float_out(y);
else printf("%.0f",y[0]/y[1]);
getchar ();
getchar ();
}
现问题是:只能输入正整数,解决了我再加分!
我想把结果按最简分数输出,像第一个回答中1.8/1就不行

第1个回答  推荐于2016-10-11
这个程序就可以了。记得给加分~
#include<stdio.h>
#include <math.h>
#include <string.h>
int gcd(int a,int b)
{
int r;
while (b)
{
r = a%b;
a = b;
b = r;
}
return a;
}
float max (float a,float b)
{
if (a>b) return a;
else return b;
}
void float_out(float f[])
{
float fvalue = f[0]/f[1]>=0?f[0]/f[1]:(-f[0]/f[1]);
char fs[100];
char rpt[100];
sprintf(fs,"%f",fvalue);
int i,j;
for (i=0;fs[i]!='.';i++);
for (j=i;fs[j]!='\0';j++);
int k;
for (k=j-1;k>i;k--)
if (fs[k]!='0')
break;
if (k!=j-1)
{
int ts = k-i;
int ue,de=1;
while (ts--)
de*=10;
ue = (int)(fvalue*de+0.1);
int gd = gcd(ue,de);
ue/=gd;
de/=gd;
if (f[0]/f[1]<0)
ue = -ue;
printf("%d/%d",ue,de);
}
else
{
int d = j-i;
int s;
for (s=1;s<=d-2;s++)//至少要有两位重复
{
strcpy(rpt,fs+i+1);
rpt[s]='\0';
int iof,ior=0;
for (iof=i+1+s;iof<j;iof++)
{
if (rpt[ior]!=fs[iof])
break;
ior++;
}
if (iof==j)
break;
}
if (s<d-2)
{
int ue,de=0;
while (s--)
de = de*10+9;
ue = (int)(fvalue*de+0.5);
int gd = gcd(ue,de);
ue/=gd;
de/=gd;
if (f[0]/f[1]<0)
ue = -ue;
printf("%d/%d",ue,de);
}
else
printf("%f",f[0]/f[1]);
}
}

int main ()
{
float a,b,c,d,e,f,x[2],y[2];
scanf ("%fx+%fy=%f\n%fx+%fy=%f",&a,&b,&c,&d,&e,&f);
x[0]=(b*f-e*c);x[1]=(d*b-a*e);
y[0]=(a*f-d*c);y[1]=(a*e-d*b);
printf("x=");
if (x[0]/x[1]!=((int)(x[0]/x[1])))
float_out(x);
else
printf("%.0f",x[0]/x[1]);
printf("\n");
printf("y=");
if (y[0]/y[1]!=((int)(y[0]/y[1])))float_out(y);
else printf("%.0f",y[0]/y[1]);
getchar ();
getchar ();
}

------------------
这个的话,首先得判定循环还是不循环。不循环就不说了:乘10到上下都是整数然后通分;循环的话,得先判断循环位数,然后除9通分,float位数恐怕太少。
-------------------
请把你错误的测试数据贴一下,或者hi我都行。
-------------------
我的测试结果:
1x+1y=2.8
2x+1y=3.8
x=1
y=-1.800000/-1.000000
你说的正整数是什么意思?本回答被提问者采纳
相似回答