分数->小数

该博客探讨如何将分数表示为小数,特别是处理无限重复小数的情况。通过一个C语言实现的示例,解释了如何计算分数的整数部分、小数部分以及确定循环节的开始。当找到相同的余数时,标记循环节并将其括在括号内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:问题描述

Description: As we know, a rational number is a number that can be represented as y/x where x and y are integers and y is not equal to zero. On the hand, a rational number could also be represented in decimal form and the resulting decimal is a finite decimal or an infinite repeating decimal. Now, you are given the x and y , please return the decimal form of y/x in string format, and enclose the repeating part for the infinite repeating decimal in parentheses, for example:
X=1, Y=2, return ‘0.5’
X=2, Y=3, return ‘0.(6)’
X=7, Y=15, return ‘0.4(6)’

二:斟酌题意:

其实就是将 一个 分数用 小数表示,如果是无限循环小数,那么用括号将循环节 括起来。事例已经说明这点。

三:思路以及方法

不妨先假设分子为26,分母为23。根据此实例加以分析。
我们先计算整数部分 pre = 26/23 ,小数部分 为 分子 numerator = 26 % 23 =3,分母denominator为 23。我们循环计算余数 remainder[i] = numerator *10 % denominator ,如果发现 存在2个相同的余数numerator,那么就开始出现 循环节。意味着循环节从此开始,到再次出现为止。
当然,我们要先计算 从小数点到 开始出现循环节的位置的部分。思路很简单,只要余数不是numerator,就一直计算一位同时重新计算余数,直至出现余数为numerator.

四:C代码如下

/*
1.运行环境:windows 7 + 32位系统 + vs2013
2.无差错控制,无安全检查,无特殊处理。
3.带刺的银杏 2015.05.17夜 于 苏州 
*/
#include <stdio.h>
#define MAX_denomintor 3000  // 分母最大值
int main(void)
{
    int numerator, denominator, loop_start,point_to_loop_numerator;     //分别为 分子,分母,循环节开始时的余数,小数点到出现循环节的计算
    int remainder[MAX_denomintor],flag_loop; //remainder为余数数组,flag_loop=0/10为有限循环,1为无线循环小数。

    printf("please input numerator and denominator:");
    scanf("%d%d", &numerator, &denominator);
    if(denominator > MAX_denomintor - 1 ) //如果分母过大,则终止程序
    {
        printf("the denomintor is too big !!");
        return -1;      
    }

    printf("%d.",numerator/denominator); //先输出整数部分
    numerator %= denominator; 
    point_to_loop_numerator = numerator;

    remainder[0] = 1;     //remainder[numerator]=1代表出现numerator这个余数
    remainder[numerator] = 1;
    numerator = numerator*10%denominator;

    for(;remainder[numerator] != 1;remainder[numerator] = 1,numerator = numerator*10%denominator);         //循环求 余数
    flag_loop = (numerator == 0) ? 0 : 1;        //判断是否为循环小数

    while (point_to_loop_numerator != numerator) //计算小数点到开始循环之间的小数部分
    {
        printf("%d",point_to_loop_numerator*10/denominator);
        point_to_loop_numerator = point_to_loop_numerator*10%denominator;
    }

    if(flag_loop == 0)
    {
        return;
    }

     printf("("); //准备打印循环节

        loop_start = numerator;      
        do 
        {
            printf("%d", numerator*10/denominator);
            numerator = numerator*10%denominator;
        } while (numerator != loop_start);
        printf(")\n");

    return 0;
}

五.小结

整体较容易,思路在手,一切都有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值