求循环小数的循环节

shengyudingli 2011-07-09 12:53:16
Description

给定一个分数,判断其是否是一个无限循环小数,并输出它的第一个循环节。
例如:分数1/3是一个无限循环小数,第一个循环节为3;而1/2不是一个无限循环小数。

Input

不多于100行,每行一个m/n形式的分数(0〈m〈n〈100000)

Output

对于每一个分数,当其是一个无限循环小数时,输出它的第一个循环节;否则输出0。每行的最后有一个换行符。

Sample Input

1/3
2/5
16/30
4/7
1/99
Sample Output

3
0
3
571428
01
...全文
1546 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
c_losed 2011-07-09
  • 打赏
  • 举报
回复
ms是acm类似的吧
至善者善之敌 2011-07-09
  • 打赏
  • 举报
回复
作业题?。。。。。。
shengyudingli 2011-07-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 i_code 的回复:]

这道题类似USACO中分数化小数问题。
LZ可以参考 http://hi.baidu.com/sixstar/blog/item/f3ff0c01ac9d6b0c7bec2cd8.html

再贴下我以前写的代码:
C/C++ code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <asser……
[/Quote]

4/7的计算过程: 4/7=0余4,即结果为0余数为4; 4*10=40、40/7=5余5,即结果为0.5余数为5; 5*10=50、50/7=7余1,即结果为0.57余数为1; 1*10=10、10/7=1余3,即结果为0.571余数为3; 3*10=30、30/7=4余2,即结果为0.5714余数为2; 2*10=20、20/7=2余6,即结果为0.57142余数为6; 6*10=60、60/7=8余4,即结果为0.571428余数为4; 由于在计算过程中余数4出现过,后面的计算过程即将重复,即找到了循环节571428。

如果这样模拟的话,会有很多情况,像这样的当然好弄,如果最开始几位不是循环的,如1/6要怎么弄啊?
shengyudingli 2011-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 c_losed 的回复:]

ms是acm类似的吧
[/Quote]
某个OJ上的······
shengyudingli 2011-07-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 babilife 的回复:]

作业题?。。。。。。
[/Quote]
不是,是我自己在OJ上面看的。
懒得打字 2011-07-09
  • 打赏
  • 举报
回复
刚才辛辛苦苦打的东西没保存,全没了,给lz个结果吧

公式是这样子的
((a1a2...an)*(10^m-1)+(b1b2..bm))/((10^m-1)*10^n)
一个例子
0.3(33)
(3*(10^2-1)+33)/((10^2-1)*10)
=(3*99+33)/990
=1/3
I_code 2011-07-09
  • 打赏
  • 举报
回复
这道题类似USACO中分数化小数问题。
LZ可以参考 http://hi.baidu.com/sixstar/blog/item/f3ff0c01ac9d6b0c7bec2cd8.html

再贴下我以前写的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define MAXDIGIT 100100

char dec[MAXDIGIT];
int lastrem[MAXDIGIT];
char buf[MAXDIGIT];

void
main(void)
{
FILE *fin, *fout;
int n, d, k, i, rem, len;

fin = fopen("fracdec.in", "r");
fout = fopen("fracdec.out", "w");
assert(fin != NULL && fout != NULL);

fscanf(fin, "%d %d", &n, &d);
sprintf(buf, "%d.", n/d);

/* 记录长除过程中是否出现过某个余数 */
for(i=0; i<MAXDIGIT; i++)
lastrem[i] = -1;

rem = n % d;
for(i=0;; i++) {
if(rem == 0) {
if(i == 0)
sprintf(buf+strlen(buf), "0");
else
sprintf(buf+strlen(buf), "%s", dec);
break;
}
if(lastrem[rem] != -1) {
k = lastrem[rem];
sprintf(buf+strlen(buf), "%.*s(%s)", k, dec, dec+k);
break;
}

lastrem[rem] = i;
n = rem * 10;
dec[i] = n/d + '0';
rem = n%d;
}

/* 每行打印76个字符 */
len = strlen(buf);
for(i=0; i<len; i+=76) {
fprintf(fout, "%.76s\n", buf+i);
}
exit(0);
}

64,681

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧