博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求分数对应循环小数的循环体
阅读量:5018 次
发布时间:2019-06-12

本文共 1476 字,大约阅读时间需要 4 分钟。

又一道笔试题,就是给定一个分数,分子为X,分母为Y,如果它是循环小数,则输出该循环小数的循环部分。

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

#include 
#define N 1000int 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

你可能感兴趣的文章
Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性
查看>>
Makefile ===> Makefile 快速学习
查看>>
java性能调优工具
查看>>
C# 其他的Url 文件的路径转化为二进制流
查看>>
cmake使用
查看>>
面向对象高级
查看>>
Bitwise And Queries
查看>>
oracle连接问题ORA-00604,ORA-12705
查看>>
Java从零开始学十三(封装)
查看>>
Python2和Python3中的rang()不同之点
查看>>
lintcode28- Search a 2D Matrix- easy
查看>>
A Simple Tree Problem
查看>>
Modular Inverse [ZOJ 3609]
查看>>
Amd,Cmd, Commonjs, ES6 import/export的异同点
查看>>
django drf 深入ModelSerializer
查看>>
Android---Menu菜单
查看>>
监控Tomcat
查看>>
Timer和TimerTask的使用--2
查看>>
Mock InjectMocks ( @Mock 和 @InjectMocks )区别
查看>>
14.精益敏捷项目管理——认识精益笔记
查看>>