- 数与连分数
- 2016-08-04 21:25:28 @
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <math.h>
#define maxn 200
char ch;
long a[maxn],a_n,digit,sign;
long fenzi,fenmu;
long gcd(long a ,long b)
{
if (b==0)
return a;
else
return gcd(b,a%b);
}
void gcd_process(long x, long y)
{
if(y==0)
{
return;
}
else
{
a[a_n]=x/y;
a_n++;
gcd_process(y,x%y);
return;
}
}
void ToFen() // 转换为分数
{
long i;
long t;
digit=0;
ch=getchar();
a_n=0; // 连分数的项数个数
if (ch=='-')
{
sign=-1; //标记负数
ch=getchar();
}
while (ch!='\n') //提取连分数的各个项存储在 a[i]中
{
if (ch>='0' && ch<='9')
{
digit = digit*10 + ch-'0';
}
else
{
a[a_n]=digit;
a_n++;
digit = 0;
}
ch=getchar();
}
fenzi=a[a_n-1];
fenmu=1;
long yueshu;
for (i=a_n-1 -1; i>=0; i--) //进行转换
{
if (i==0)
{
if (sign==1)
{
t=fenmu;
fenmu = fenzi;
fenzi = t + fenzi *a[i];
}
else
{
t=fenmu;
fenmu = fenzi;
fenzi = fenzi *a[i]- t;
}
}
else
{
t=fenmu;
fenmu = fenzi;
fenzi = t + fenzi * a[i];
}
}
yueshu = gcd(fenzi,fenmu);
//化简分数
fenzi /= yueshu;
fenmu /= yueshu;
// output
if (sign==-1) printf("-");
if (fenmu==1)
{
printf("%ld\n",fenzi);
}
else
{
printf("%ld/%ld\n",fenzi,fenmu);
}
}
void ToLian() //转换为连分数
{
long i;
digit=0;
a_n=0;
if (ch=='-')
{
sign=-1; //负号标示
ch=getchar();
}
while (1) //提取分子fenzi 和分母fenmu
{
if (ch>='0' && ch<='9')
{
digit = digit*10 + ch-'0';
}
else
{
a[a_n]=digit;
a_n++;
digit = 0;
}
if (ch=='\n') break;
ch=getchar();
}
if (a_n==1)
{
printf("[");
if(sign==-1) printf("-");
printf("%ld]\n",a[0]);
return;
}
fenzi=a[0];
fenmu=a[1];
a_n=0;
// 将得到的 连分数的项 存储在a[i]中
if (sign==1)
{
gcd_process(fenzi,fenmu);//依次存储
}
else if (sign==-1)
{
if (fenzi%fenmu==0)
{
gcd_process(fenzi,fenmu);
}
else
{
a[0]=fenzi/fenmu+1;
a_n++;
gcd_process(fenmu,a[0]*fenmu-fenzi);
}
}
//output
if (a_n>1)
{
printf("[");
if(sign==-1) printf("-");
printf("%ld;",a[0]);
for (i=1;i< a_n-1; i++)
{
printf("%ld,",a[i]);
}
printf("%ld]\n",a[a_n-1]);
}
else
{
printf("[");
if(sign==-1) printf("-");
printf("%ld]\n",a[0]);
return;
}
}
int main()
{
while(~(ch=getchar()))
{
sign=1; // 1 positive -1 negative
if (ch=='[')
ToFen(); // 转换为分数
else
ToLian(); //转换为连分数
}
return 0;
}
1 条评论
-
wsadlxx LV 8 @ 2016-08-05 14:50:08
一个一个读取字符怎么就不行呢? 最后一行的末尾没有\n,使得我的程序runtime error 或者 TLE ?
whatever, 读取字符串后就AC 啦~~~
- 1