[算法浅析] 计算循环节
来源:互联网 发布:淘宝广州模特招聘骗局 编辑:程序博客网 时间:2024/06/13 00:21
整体的思路来自于这篇文章:http://hi.baidu.com/chu2rikka/item/59ff471961814ae45f53b1cf
#include<iostream>原创程序,因为没有看到合适的题目能提交,不能严谨地验证程序正确性,故若有bug欢迎指正。
#include<map>
#include<cmath>
using namespace std;
int gcd(int x, int y)
{
return y == 0 ? x : gcd(y, x % y);
}
int main()
{
int x, y, tmp;
while(~scanf("%d%d", &x, &y))
{
int div = gcd(x, y);
x /= div; // 例如4/24要转化成1/6,不然的话会对后面分母计算2与5的因子数有干扰
y /= div;
int num = x % y;
printf("%d.", x / y); // 首先输出整数部分
if(x % y == 0) // 若是4/2则没必要计算,直接输出结果
{
printf("0\n");
continue;
}
int aa, bb = 0, tmp = y;
aa = (int)log2((tmp & (-tmp))); // 计算分母中质因数2的个数,这里用了个小技巧
while(tmp % 5 == 0) // 计算分母中质因数5的个数
{
bb++;
tmp /= 5;
}
aa = aa > bb ? aa : bb; // 质因数2和5的数量谁多,循环节就从几位开始,例如45/56,aa=3
while(aa--) // 前几位小数不算在循环节内,直接输出
{
printf("%d", int(num * 10 / y));
num = num * 10 % y;
}
bb = num; // 循环节开始时的余数,第二个循环节头,即循环结束位置,应与此余数相同
if(num) // 需要判断当前余数是否为零,否则某些输出的末尾会带有(0)导致输出格式问题
{
printf("(");
printf("%d", int(num * 10 / y));
num = num * 10 % y; // 这两句不可少,若为1/3,则结果为没有前置小数的一位循环节0.(3),需特殊处理
while(num != bb)
{
printf("%d", int(num * 10 / y));
num = num * 10 % y;
}
printf(")");
}
printf("\n");
}
return 0;
}
0 0
- [算法浅析] 计算循环节
- 【计算机网络】循环冗余校验CRC算法原理&计算过程
- 算法浅析
- 浅析Windows消息循环
- 云计算定义浅析
- 浅析云计算
- 云计算管理浅析
- 云计算管理浅析
- 云计算管理浅析
- 大数据与云计算笔记[三]:使用素数的RSA算法浅析
- 计算循环冗余校验码计算
- 浅析wtl消息循环机制
- 计算循环冗余码
- 耗时计算移出循环
- 循环移位计算
- 循环-02. 计算圆周率
- 循环-02. 计算圆周率
- <c:foreach>循环计算
- [杂谈] 部分常用的algorithm及numeric函数
- [C#] 委托入门
- [杂谈] 回顾switch
- 黑马程序员—JDK1.5新特性(增强for循环、可变参数、静态导入)
- Objective C内存布局
- [算法浅析] 计算循环节
- hdu 1597 find the nth digit
- poj 1129 Channel Allocation
- hdu 1978 How many ways
- 博弈小结(备忘录)
- Maven 的介绍以及使用(初学者笔记)
- [一站式服务] Windows下C++文件编译.so 文件
- hdu 1598 find the most comfortable road
- poj 2823 Sliding Window (单调队列 or 线段树)