hdu 2522 1/nの循環節の小さいシミュレーションを求めてまたmemsetは時間の特殊な書き方を節約します

1999 ワード

A simple problem
Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2567    Accepted Submission(s): 882
Problem Description
Ztyは数学の問題に夢中だ.ある日、yifenfeiは数学の問題を出して彼を倒すのが難しいと思って、彼に1/nに答えさせました.でもZtyは答えられない^^.みんなでプログラミングして彼を助けてください.
 
Input
1行目の整数Tは、テストグループ数を表す.後のT行は、行毎に1つの整数n(1<=|n|<=10^5)である.
 
Output
出力1/n.(循環小数である、最初の循環節のみ出力).
 
Sample Input

   
   
   
   
4 2 3 7 168

 
Sample Output

   
   
   
   
0.5 0.3 0.142857 0.005952380

 
Author
yifenfei
 
コードは簡単です  直接シミュレーションして最初は自分の頭がぼんやりしていて、結果をans配列に保存しなければならなくて、それからめちゃくちゃになりました.   現実の演算を直接シミュレートすればいい
 
 
またmemsetの使用に注意  直接memset(a,0,sizeof(a)); 時間がもったいない
memset(a,0,(n+100)*sizeof(a[0]))の場合  これでだいぶ速くなります
次の手順について    直接memsetが2000 msにタイムアウトすると  上記の方法で200 msしかかかりません
 
 
#include<stdio.h>
#include<string.h>
int vis[1000000+100];
int main()
{
    int cas,n,i;
    scanf("%d",&cas);
    while(cas--)
    {
       scanf("%d",&n);
       if(n<0) {printf("-");n=-n;}
       memset(vis,0,(n+100)*sizeof(vis[0]));
       int  cnt=0;
       int fz=1,fm=n;
       if(n==1) {printf("1
");continue;} printf("0."); while(fz!=0) { vis[fz]=1; fz=fz*10; printf("%d",fz/fm); fz=fz%fm; if(vis[fz]) break; } printf("
"); } return 0; }