题目链接:here~~
模拟普通的除法,当遇到已经出现过的余数时停止,一开始余数是1本身,还要注意的是当余数乘一个10还是不大于被除数时,余数是乘10之后的余数,比如:1/99,1*10=10还是小于99,那么余10,这个余数也要标记!下面是我看到的比较好的代码:(比较之后发现第一个时间较短)
#include<iostream>
#include<memory.h>
using namespace std;
char a[100010];
bool b[100010];
void fn(int n)
{
memset(b,false,sizeof(b));
if(n == 1) cout<<1<<endl;
else
{
a[0] = '0'; a[1] = '.'; b[1] = true;
int carry = 1;
int j = 1, k = 2;
while(carry)
{
carry *= 10;
a[k++] = carry / n + '0';
carry = carry % n;
if(b[carry]) break;
b[carry] = true;
}
a[k] = '\0';
cout<<a<<endl;
}
}
int main()
{
int n,t;
cin>>t;
while(t--)
{
cin>>n;
if(n<0){n = -n; cout<<"-";}
fn(n);
}
return 0;
}
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
bool a[100010]; //存余数
int main()
{
int ncase;
int num, temp;
scanf("%d", &ncase);
while(ncase--)
{
temp = 1;
memset(a, 0, sizeof(a));
scanf("%d", &num);
if(num < 0)
printf("-0.");
else
printf("0.");
while(a[temp] != 1 && temp != 0)
{
a[temp] = 1;
temp *= 10;
printf("%d", temp / num);
temp %= num;
}
printf("\n");
}
return 0;
}