/*************************************************************************
> File Name: 45.c
> Author: ma6174
> Mail: ma6174@163.com
> Created Time: 2017年05月17日 星期三 20时09分56秒
************************************************************************/
#include<stdio.h>
//题目:求分数的精确值,如果是有限小数,直接输出,如果是循环小数输出第一次循环
int cmp(int *, int, int);//判断无限小数是否完成第一次循环
int output(int *, int);//输出函数
int div(int*, int, int);//将分数存入数组
int main()
{
int a, b;
int d[100];//数组第一位是存小数点前的值,后面存小数点之后的值,数组一位对应一位小数
int c, i;
printf("please input a fraction\n");
scanf("%d/%d", &a, &b);
i = div(d, a, b);//div返回数组长度
output(d, i);//输出
return 0;
}
int div(int d[], int a, int b)
{
int i = 0, o[100] = {0};
int f = 1;
while(i < 100)
{
d[i] = a / b;
o[i] = a % b;
f = a % b;
a = o[i] * 10;
i++;
if(f == 0)//如果f = 0 数组是有限的直接退出循环
{
break;
}
}
return i;
}
int output(int d[], int c)
{
int i = 0, j = 0;
int f = 0;
int l;
if(c < 100)//c < 100 说明是有限
{
printf("get a finite fraction:");
for(i = 0; i < c; i++)
{
if(i == 1)
{
printf(".");
}
printf("%d", d[i]);
}
}
else
{
for(i = 0;i < c; i++)
{
for(j = i + 1; j < 100; j++)
{
if(d[j] == d[i])//i,j是小数的两位,确定i后,从i+1位寻找j位,使得j位等于i位
{
if(cmp(d, i, j))//若j - i = l再判断i到i+l是否分别等于j到j+l若成立 输出该小数,从0位到j--位
{
if(f == 1)
{
break;
}
f = 1;
printf("get a infinite fraction:");
for(l = 0; l <= j; l++)
{
if(l == 1)
{
printf(".");
}
printf("%d", d[l]);
}
printf("\nthe circle begin %dand end in %d after decimal point\n", i, --j);
}
}
}
}
}
printf("\n");
}
int cmp(int d[], int i, int j)//判断i到i + n位是否分别等于j到j + n位
{
int t = j;
for(; i < j; i++, t++)
{
if(d[i] != d[t])
{
return 0;
}
}
return 1;
}
结果:
求分数的精确值
最新推荐文章于 2021-05-25 22:04:47 发布