分数化为有限小数或无限循环小数(c实现)

原创 2005年05月01日 05:19:00
问题描述:
将分数转化为小数,相信很多人都会吧.那么,这里给定一个分数N/D,N为分子,D为分母(N,D均为整数),试编程求出N/D的小数形式,当然如果这个小数为无限循环小数,则把循环的部分用括号括起来,接着循环的部分则省略不写。比如:
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)
输入为两个正整数N,D(1 <= N,D <= 100000),输出为对应的小数(为了对齐格式,请一行最多输出76个字符)。
样例输入:
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;
} *shang_head=0, *shang_tail=0;

struct node_yushu {/*余数结点*/
  long data;
  struct node_yushu *next;
} *yushu_head=0, *yushu_tail=0;


int shang_empty(void) {/*判断商串是否空*/
  return shang_head==0;
}
int yushu_empty(void) {/*判断余数串是否空*/
  return yushu_head==0;
}
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())
    shang_head=shang_tail=newptr;
  else {
    shang_tail->next= newptr;
    shang_tail= newptr;
  }
}
void insert_yushu(long a) {/*插入余数结点*/
  struct node_yushu *newptr= new_yushu_node(a);

  if(yushu_empty())
    yushu_head=yushu_tail=newptr;
  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;

  for(i=yushu_head, ind=0; i->next!=0; i=i->next, 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) {/*发现循环节*/
    j=shang_head;
    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;

  i=shang_head;
  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;
}

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

节选自《编程之美》 设一个循环小说X=0.a1a2a3...an(b1b2...bm),括号中的是循环节,例0.333(333) 将X分成两部分,X=(a1a2..an+0.(b1b2..bm))...
  • havedream_one
  • havedream_one
  • 2014年12月11日 09:05
  • 2854

poj1930(无限循环小数化成分数)

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

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

无限循环小数也是有理数,而有理数是能表示为两个整数之比的数。如何将无限循环小数转化成分数? 以0.148257148257...0.148257148257...为例。 它的循环部分为:14825...
  • weixin_35653315
  • weixin_35653315
  • 2017年05月15日 19:56
  • 316

小数化为分数 编程之美

转自点击打开链接 以下描述来自>: 在计算机中,使用float或者double来存储小数是不能得到精确值的。如果你希望得到精确计算结果,最好是用分数形式来表示小数。有限小数或者无限循环小数都可以转...
  • u012577123
  • u012577123
  • 2015年02月05日 14:12
  • 2070

无限循环小数的循环节

输入两个数M,N(均小于100),M/N可能为有限小数,也可能为无限循环小数,如: 1/4=0.25 1/7=0.142857142857142857...... 如果M/N为有限小数,则输出其...
  • u012637253
  • u012637253
  • 2014年07月13日 22:03
  • 702

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

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

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

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

无限循环小数化为分数

前几天被一个小朋友的问题难住了,是怎样将无限循环小数化为分数。当时听到这个问题的时候,第一反应是:这个学过啊,但是自己一点印象都没有啊,在这么多人面前,自己还是个研究生,太丢人了吧。还好小朋友比较给面...
  • cc_lq
  • cc_lq
  • 2011年09月16日 19:24
  • 5280

无限循环小数转化为分数

比如:0.33333... s = 0.3x (1/10)^0+3x(1/10)^1+3x(1/10)^2+....+3x(1/10)^n; n->无穷。 s = f(n->oo) = 0...
  • xiuye2015
  • xiuye2015
  • 2015年09月27日 13:59
  • 233

把无限循环小数化为分数

把无限循环小数化为分数 给定一个无限循环小数,我们是否能把它化为分数呢?其实方法也很简单,其关键在于利用「无限循环」这一点。例如,给定小数0.272727...,如何把它化为分数呢?我们可以先把它写...
  • xcwenn
  • xcwenn
  • 2013年04月24日 09:59
  • 628
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分数化为有限小数或无限循环小数(c实现)
举报原因:
原因补充:

(最多只允许输入30个字)