您的位置:首页 > 其它

fzu2223

2016-04-20 16:20 288 查看
#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include <stdio.h>
#include <algorithm>
#include <map>

typedef long long LL ;

namespace  MyMap{
const static int  MOD = 1000007  ;
int  head[MOD] ;

LL   val[MOD] ;
int  next[MOD] ;
int  to[MOD] ;
int  size  ;

void clear(){
memset(head , -1 , sizeof(head)) ;
size = 0 ;
}

int find(LL x){
long u = (x % MOD + MOD) % MOD ;
for(int i = head[u] ; i != -1 ; i = next[i]){
if(val[i] == x) return to[i] ;
}
return -1 ;
}

void  insert(LL x , int y){
int u = (x % MOD + MOD) % MOD ;
val[size] = x ;
to[size] = y ;
next[size] = head[u] ;
head[u] = size++ ;
}

};

void gao(LL n , LL m){
if(n % m == 0){
printf("%I64d\n" , n / m) ;
return ;
}

std::vector<char> res ;
MyMap::clear() ;
int resSize = 0 ;
LL d = n / m ;
if(d == 0) res.push_back('0') ;
while(d){
res.push_back( (d%10) + '0' ) ;
d /= 10 ;
}
std::reverse(res.begin() , res.end()) ;

res.push_back('.');
int idx = 0 ;
n %= m ;
while(MyMap::find(n) == -1){
MyMap::insert(n , idx++)  ;
n *= 10 ;
res.push_back( (n/m) + '0' ) ;
if(res.size() > 1000000){
puts("Too long") ;
return ;
}
n %= m ;
if(n == 0) break ;
}
if(n > 0){
int lenth = idx - MyMap::find(n)  ;
int i = res.size()  - lenth ;
res.insert(res.begin() + i , '(') ;
res.push_back( ')' ) ;
}
if(res.size() > 1000000){
puts("Too long") ;
return ;
}
for(std::vector<char>::iterator it = res.begin() ; it != res.end() ; it++)
putchar(*it) ;
putchar('\n') ;
}

int main()
{
LL n , m ;
int t ;
std::cin>>t ;
while(t--){
std::cin>>n>>m ;
gao(n , m) ;
}
return 0;
}


string + 操作太慢,用string超时

#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include <stdio.h>
#include <algorithm>
#include <map>

typedef long long LL ;
//std::map<int , int> re ;

std::string intTostring(LL n){
if(n == 0) return "0" ;
std::string s = "" ;
while(n){
char c = (n%10) + '0' ;
s = c + s ;
n /= 10 ;
}
return s ;
}

struct  MyMap{
const int  MOD = 1000007  ;
LL   val[MOD+8] ;
int  head[MOD+8] ;
int  next[MOD+8] ;
int  to[MOD+8] ;
int  size  ;

void clear(){
memset(head , -1 , sizeof(head)) ;
size = 0 ;
}

int  find(LL x){
long u = (x % MOD + MOD) % MOD ;
for(int i = head[u] ; i != -1 ; i = next[i]){
if(val[i] == x) return to[i] ;
}
return -1 ;
}

void  insert(LL x , int y){
int u = (x % MOD + MOD) % MOD ;
val[size] = x ;
to[size] = y ;
next[size] = head[u] ;
head[u] = size++ ;
}

};

MyMap re ;

std::string gao(LL n , LL m){
if(n % m == 0){
return  intTostring(n/m) ;
}

re.clear() ;
std::string res ;
res += intTostring(n/m) ;
res += "." ;
int idx = 0 ;
n %= m ;
while(re.find(n) == -1){
re.insert(n , idx++ )  ;
n *= 10 ;
res += intTostring(n/m) ;
if(res.length() > 1000000)
return "Too long" ;
n %= m ;
if(n == 0) break ;
}
if(n > 0){
int lenth = idx - re.find(n)  ;
int i = res.length() - lenth ;
res.insert(res.begin() + i , '(') ;
res += ")" ;
}
if(res.length() > 1000000)
return "Too long" ;
return res ;
}

int main()
{
LL n , m ;
int t ;
std::cin>>t ;
while(t--){
std::cin>>n>>m ;
printf("%s\n" , gao(n , m).c_str()) ;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: