笔试题——输出循环小数的循环节
2011-05-12 20:24
232 查看
求一个分数对应小数的循环节。、
思路:
我们分别用x和y表示分子和分母,先求出整数部分x div y和余数部分x mod y,那么小数部分就是重复将余数部分乘以10再进行整除运算和求余运算,直到出现循环或余数为0时结束。
我们不妨从余数入手,因为小数部分整除的结果是由上一次运算的余数决定的,如果某一次运算产生的余数跟前面产生的余数相同,则说明循环开始。
参考代码:
思路:
我们分别用x和y表示分子和分母,先求出整数部分x div y和余数部分x mod y,那么小数部分就是重复将余数部分乘以10再进行整除运算和求余运算,直到出现循环或余数为0时结束。
我们不妨从余数入手,因为小数部分整除的结果是由上一次运算的余数决定的,如果某一次运算产生的余数跟前面产生的余数相同,则说明循环开始。
参考代码:
#include<stdio.h> #define mn 1000 void main() { int i,m,n,r,t; int p[mn],q[mn]; for(i=0;i<mn;i++) //给数组p初始化值全为-1 { p[i]=-1; q[i]=0; } printf("input :m,n(0<=m<n<=1000)= "); scanf("%d%d",&m,&n); t=0; //初始化值 r=m; //把被除数赋给r while(r!=0&&(p[r]==-1)) //循环条件当r不为0且p[r]=-1时执行循环体 { p[r]=t; //余数r第一次出现的位置 r=10*r; //把被除数扩大10倍,以至于取第一个小数 t++; q[t]=r/n; //计算小数点后t位的值:取整,即为m/n的小数从小数点开始逐个取出放到数组q中 r=r%n; //算完一位就去掉一位,即取余对n } printf("m/n = 0."); //因为m<n,所以m/n整数部分0,所以先输出'0.' if (r!=0) //被除数不为0就执行以下语句 { for(i=1;i<=p[r];i++) //输出循环小数中前面非循环的部分 printf("%d",q[i]); printf("("); //输出循环的小数放在括号中 for(i=p[r]+1;i<=t;i++) printf("%d",q[i]); printf(")"); } else //被除数为0的情况 for(i=1;i<=t;i++) //输出不循环的小数 printf("%d",q[i]); printf("/n"); }
相关文章推荐
- 输出1/n的小数位,是循环小数输出一个循环节
- 面试:输出循环小数的循环节
- 面试:输出循环小数的循环节
- UVA 202 - Repeating Decimals(循环小数循环节)
- 求循环小数循环节
- 输出循环小数
- 从键盘输入某个十进制小数或整数,转换成对应的二进制小数并输出。 (查询十进制小数转换成二进制小数的算法,使用循环来实现。 最多保留小数位后7位数字即可)算法
- nyoj 329 循环小数【KMP】【求最小循环节长度+循环次数+循环体】
- UVA 202 - Repeating Decimals【循环小数循环节】
- 求除以3后结果为以3为循环节的纯循环小数的连续正整数的程序!
- 输出循环小数
- 一道求循环小数的程序员笔试题
- 3358 Period of an Infinite Binary Expansion 给出十进制数p和q,将p/q表示成二进制小数,并求出二进制小数的循环节起始位置和循环节的长度 欧拉函数
- 1/7 = 0.142857142... 是个无限循环小数。 任何有理数都可以表示为无限循环小数的形式。 本题目要求即是:给出一个数字的循环小数表示法。 例如: 输入: 1,5 则输出: 0.2 输入
- python再计算无限循环小数的循环节
- POJ 1930 Dead Fraction(gcd—枚举循环节,无限循环小数变最简分数)
- 编程实现表示循环小数,例如将1/3表示为0.3(3)就是将循环节放在括号中
- 循环小数的循环节问题
- UVA 202 - Repeating Decimals【循环小数循环节】