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

这是一个使用C语言编写的程序,可以将分数转化为小数,包括有限小数和无限循环小数。程序通过定义结构体来存储商和余数,实现了分数除法操作。当遇到无限循环小数时,程序会自动添加括号表示循环节。程序读取两个正整数作为分数的分子和分母,然后输出转换后的小数。
问题描述:
将分数转化为小数,相信很多人都会吧.那么,这里给定一个分数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 {/*余数结点*/
 
在十进制下,一个分数可以表示为 $\frac{a}{b}$ 的形式($a$ 为分子,$b$ 为分母,且 $a,b$ 为整数,$b\neq0$)。 从十进制的本质来看,十进制是基于 10 进行计数的,而 $10 = 2\times5$。当进行除法运算 $\frac{a}{b}$ 时,其实质是将 $a$ 不断地按照 $b$ 的大小进行分割。 如果分母 $b$ 仅包含 2 和 5 的任意次方的组合,例如 $b = 2^m\times5^n$($m,n$ 为非负整数),那么可以通过分子分母同时乘以适当的数,将分母转化为 $10^k$ 的形式($k$ 为非负整数)。例如,若 $b = 2^3\times5^2$,分子分母同时乘以 $2^2\times5^3$,分母就变为 $2^5\times5^5 = 10^5$。此时分数 $\frac{a}{b}$ 就可以写成 $\frac{a\times(2^{k - m}\times5^{k - n})}{10^k}$,而这种形式的分数必然可以化为有限小数。 若分母 $b$ 包含除 2 和 5 之外的其他质因数,由于 10 无法分解出这些质因数,在进行除法运算时,无论怎么对分子分母进行变形,都无法将分母转化为 $10^k$ 的形式。在不断做除法的过程中,余数会出现循环的情况,从而导致商也会出现循环,最终结果就是无限循环小数。 ### 示例代码 ```python def is_terminating_decimal(numerator, denominator): def gcd(a, b): while b: a, b = b, a % b return a common_divisor = gcd(numerator, denominator) simplified_denominator = denominator // common_divisor while simplified_denominator % 2 == 0: simplified_denominator //= 2 while simplified_denominator % 5 == 0: simplified_denominator //= 5 return simplified_denominator == 1 numerator = 7 denominator = 12 print(is_terminating_decimal(numerator, denominator)) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值