# 分数化为有限小数或无限循环小数（c实现）

1/3    =0.(3)
22/5=4.4
1/7    =0.(142857)
2/2    =1.0
3/8    =0.375
45/56    =0.803(571428)

1 3
22 5
1 7

0.(3)
4.4
0.(142857)

============code===================
/**
*Copyright (C) aprin at Xiamen University
*2005-04-23
*/
#include <stdio.h>
#include <string.h>
#define LEN_SHANG sizeof(struct node_shang)
#define LEN_YUSHU sizeof(struct node_yushu)

struct node_shang {/*商结点*/
char data;
struct node_shang *next;

struct node_yushu {/*余数结点*/
long data;
struct node_yushu *next;

int shang_empty(void) {/*判断商串是否空*/
}
int yushu_empty(void) {/*判断余数串是否空*/
}
struct node_shang *new_shang_node(char ch) {/*新建商的结点*/
struct node_shang *ptr= (struct node_shang *) malloc(LEN_SHANG);
ptr->data=ch;
ptr->next=0;
return ptr;
}
struct node_yushu *new_yushu_node(long a) {/*新建余数结点*/
struct node_yushu *ptr= (struct node_yushu *) malloc(LEN_YUSHU);
ptr->data= a;
ptr->next=0;
return ptr;
}
void insert_shang(char ch) {/*插入商字符串的结点*/
struct node_shang *newptr= new_shang_node(ch);

if(shang_empty())
else {
shang_tail->next= newptr;
shang_tail= newptr;
}
}
void insert_yushu(long a) {/*插入余数结点*/
struct node_yushu *newptr= new_yushu_node(a);

if(yushu_empty())
else {
yushu_tail->next= newptr;
yushu_tail= newptr;
}
}

char *longinttostr(long a, char *str) {/*将长整型转化为字符串*/
char temp;
int i, j;

i=0;
if(a==0) {/*a=0时特别处理*/
str[0]='0';
i++;
} else {
while(a!=0) {
str[i]=(a%10)+'0';
a=a/10;
i++;
}
}
str[i]='/0';
for(j=0; j<=(i-1)/2; j++) {/*倒置*/
temp= str[j];
str[j]= str[i-1-j];
str[i-1-j]= temp;
}

return str;/*返回长度*/
}

long found_xunhuan(void) {/*通过余数是否相等判断是否出现循环节，若出现返回出现位置的指针ind（相对小数点的偏移量），若无反回-1*/
struct node_yushu *i;
long ind;

if(yushu_tail->data==i->data)
return ind;
if(i->next==0)
return -1;
}

void div(long d, long n) {/*d是被除数，n是除数*/
long yushu, shang_zhenshu, temp, i, len_temp;
char str[7];
struct node_shang *j, *new_node;

/*计算整数部分*/
shang_zhenshu= d/n;
d=d%n;
insert_yushu(d);/*余数保存到余数链表*/
longinttostr(shang_zhenshu, str);
i=0;
while(str[i]!='/0') {/*商保存到商链表*/
insert_shang(str[i]);
i++;
}
insert_shang('.');
if(d==0) {/*恰好整除的情况*/
insert_shang('0');
return;
}
while((d!=0)&&((temp=found_xunhuan())==-1)) {/*当除尽或发现循环节时停止*/
d=d*10;/*进位*/
insert_shang((d/n)+'0');
insert_yushu(d%n);
d=d%n;
}
/*除法已完成*/
if(temp!=-1) {/*发现循环节*/
while(j->data!='.')/*找到小数点的位置*/
j=j->next;
for(i=0;i<temp; i++)
j=j->next;/*找到循环节开始的前一位*/
new_node= new_shang_node('(');
new_node->next=j->next;
j->next= new_node;
new_node= new_shang_node(')');
shang_tail->next= new_node;
shang_tail= new_node;
}
}

void output(void) {
struct node_shang *i;
long temp;

temp=0;
while(i->next!=0) {
putchar(i->data);
i=i->next;
temp++;
if((temp%76)==0)/*每行输出76个字符*/
putchar('/n');
}
putchar(shang_tail->data);
putchar('/n');
}

int main(void) {
long d, n;

scanf("%ld %ld", &d, &n);
while((d<1)||(d>100000)||(n<1)||(n>100000)) {
printf("Input is wrong! Please inpute again!(1<=d, n<=100000)/n");
scanf("%ld %ld", &d, &n);
}
div(d, n);
output();

return 0;
}
• 本文已收录于以下专栏：

## 将无限循环小数转换成分数形式

• havedream_one
• 2014年12月11日 09:05
• 2854

## poj1930（无限循环小数化成分数）

/* translation: 给出一个无限循环小数，把该小数改写成以最简分数表示的形式 solution: 如果能够求出分数的表示形式的话，那么利用gcd就可以化简。但是想了好久没有想出怎么化成...
• qq_29169749
• 2016年10月31日 22:07
• 524

## 如何将无限循环小数转化为分数

• weixin_35653315
• 2017年05月15日 19:56
• 316

## 小数化为分数 编程之美

• u012577123
• 2015年02月05日 14:12
• 2070

## 无限循环小数的循环节

• u012637253
• 2014年07月13日 22:03
• 702

## 我的程序(6):分数小数互相转换

# -*- coding: utf-8 -*-#author : wayne   http://blog.csdn.net/wayne92/#email:moonbingbing@gmail.comi...
• wayne92
• 2007年09月14日 18:01
• 4268

## 判断一个分数是否为无限循环小数

#include int main() { int remiander[101] = {0};//存放余数 int quotient[101] = {0}; int m; ...
• qq_31029351
• 2016年12月15日 22:12
• 910

## 无限循环小数化为分数

• cc_lq
• 2011年09月16日 19:24
• 5280

## 无限循环小数转化为分数

• xiuye2015
• 2015年09月27日 13:59
• 233

## 把无限循环小数化为分数

• xcwenn
• 2013年04月24日 09:59
• 628

举报原因： 您举报文章：分数化为有限小数或无限循环小数（c实现） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)