hdu 2522 A simple problem (模拟,求小数循环节)

题目链接

题意:求一个小数的循环节...

思路:其实直接模拟就好...

模拟竖式计算...

这里用到一个小技巧。

由于多组数据,每次都memset一个bool会很慢,导致超时。

我们可以用一个人int数组来代替每次重置的bool数组,

 1/* ***********************************************
 2Author :111qqz
 3Created Time :Tue 01 Nov 2016 08:00:49 PM CST
 4File Name :code/hdu/2522.cpp
 5************************************************ */
 6#include <cstdio>
 7#include <cstring>
 8#include <iostream>
 9#include <algorithm>
10#include <vector>
11#include <queue>
12#include <set>
13#include <map>
14#include <string>
15#include <cmath>
16#include <cstdlib>
17#include <ctime>
18#define fst first
19#define sec second
20#define lson l,m,rt<<1
21#define rson m+1,r,rt<<1|1
22#define ms(a,x) memset(a,x,sizeof(a))
23typedef long long LL;
24#define pi pair < int ,int >
25#define MP make_pair
26using namespace std;
27const double eps = 1E-8;
28const int dx4[4]={1,0,0,-1};
29const int dy4[4]={0,-1,1,0};
30const int inf = 0x3f3f3f3f;
31const int N=1E6+7;
32int vis[N];
33int n;
34int cnt = 0;
35void solve( int n)
36{
37    if (n<0)
38    {
39	printf("-");
40	n = -n;
41    }
42    if (n==1)
43    {
44	printf("1");
45	return;
46    }
47    int x;
48    printf("0.");
49    for ( x = 10; x ;x*=10)
50    {
51	if (vis[x]==cnt) break;
52	vis[x] = cnt;
53	printf("%d",x/n);
54	x%=n;
55    }
56    puts("");
57}
58int main()
59{
60	#ifndef  ONLINE_JUDGE 
61	freopen("code/in.txt","r",stdin);
62  #endif
63	int T;
64	scanf("%d",&T);
65	while (T--)
66	{
67	    scanf("%d",&n);
68	    cnt++;
69	    solve(n);
70	}
71  #ifndef ONLINE_JUDGE  
72  fclose(stdin);
73  #endif
74    return 0;
75}