求分数对应循环小数的循环体

又一道笔试题,就是给定一个分数,分子为X,分母为Y,如果它是循环小数,则输出该循环小数的循环部分。
要使某位在小数部分循环出现,就是要使此时的余数和之前某位的余数相等,整理下思路,分子除以分母得到余数,然后余数乘以10再除以分母得到下一个余数,如此循环做下去,看看此时的余数有没跟之前余数相等的,有的话,它就是循环小数,也就找到循环体了。

#include <stdio.h>
#define N  1000

int checkSame(int a[], int maxIndex, int checkValue)
{
    int j;
    for(j = 0; j <= maxIndex; j++)
        if(a[j] == checkValue)
            return j;
    return -1;
}

void findRecurringDigits(int x, int y)
{
    int i=0;
    int quotient, remainder, checkFlag, k;
    int quotients[N], remainders[N];
    remainder = x % y;
    if(remainder == 0){
        printf("Be divided with no remainder.\n");
        return;
    }
    remainders[0] = remainder;
    while(true){
        quotient = remainder * 10 / y;
        remainder = remainder * 10 % y;
        if(remainder == 0)
            return;
        quotients[i] = quotient;
        checkFlag = checkSame(remainders, i, remainder);
        if(checkFlag >= 0){
            //print the recurring digits
            for(k = checkFlag; k <= i; k++)
                printf("%d", quotients[k]);
            printf("\n");
            return;
        }
        if( i+1 >= 1000){
            printf("The recarring part is too long to catch.\n");
            return;
        }
        remainders[++i] = remainder;
    }
}

int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    findRecurringDigits(a, b);
    return 0;
}

 

因为是否正负不影响循环部分,所以这里就只考虑分子,分母都为正数的情况。
验证了下:1/3 , 3/7 , 2/1...应该没什么问题了吧

转载于:https://www.cnblogs.com/sillypudding/archive/2013/03/03/2941663.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值