题目传送门: http://vjudge.net/problem/UVA-202
题意:除法模拟,循环小数要将循环位表示出来。
思路:此题的关键是找到循环节,循环节可以可以根据模拟除法时没次的余数进行判断,若出现之前重复的余数,说明出现了循环节,回溯找到完整的循环节,然后输出就行了。
代码如下:
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define lowbit(x) x&(-x)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ll long long
#define ull unsigned long long
#define mem(n,v) memset(n,v,sizeof(n))
#define MAX 1000005
#define MAXN 2000005
#define PI 3.1415926
#define E 2.718281828459
#define opnin freopen("text.in.txt","r",stdin)
#define clsin fclose(stdin)
const int INF = 0x3f3f3f3f;
const ll INFF = 0x3f3f;
const double pi = 3.141592653589793;
const double inf = 1e18;
const double eps = 1e-8;
const ll mod = 1e9+7;
const ull mx = 133333331;
struct digit
{
int num;
bool flag;
int last;
bool posi;//true >0
digit(int n= 0,int l = 0,int f = 0,int p = 0) : num(n),last(l),flag(f),posi(p){}
};
struct digit digits[MAX];
int ans[MAX];
int ans1[MAX];
void init()
{
mem(digits,0);
mem(ans,0);
mem(ans1,0);
}
int main()
{
int a,b;
while(scanf("%d %d",&a,&b) != EOF){
init();
printf("%d/%d = ",a,b);
int temp = a/b;
a %= b;
if(a == 0 && temp == 0){
printf("0.(0)\n 1 = number of digits in repeating cycle\n\n");
continue;
}
int be = a;
digits[a].flag = 1;
digits[a].num = temp;
digits[a].posi = true;
int last = a;
// cout << "a,num: " << a << ' ' << temp << endl;
for(;;){
a *= 10;
temp = a/b;
a %= b;
// cout << "a,num: " << a << ' ' << temp << endl;
if(digits[a].flag) break;
digits[a].flag = 1;
digits[a].num = temp;
digits[a].posi = false;
digits[a].last = last;
last = a;
}
int f = a;
int b = last;
int cnt = 0;
int cnt2 = 0;
int cnt3 = 0;
bool flag = false;
if(!a) ans[cnt++] = 0;
else{
ans[cnt++] = temp;
while(b != a){
ans[cnt++] = digits[b].num;
b = digits[b].last;
}
}
while(!digits[b].posi){
ans1[cnt2++] = digits[b].num;
b = digits[b].last;
}
printf("%d.",digits[be].num);
for(int i=cnt2-1;i>=0;i--){
printf("%d",ans1[i]);
if(++cnt3 == 50){
flag = true;
break;
}
}
if(!flag){
printf("(");
for(int i=cnt-1;i>=0;i--){
printf("%d",ans[i]);
if(++cnt3 == 50){
printf("...");
break;
}
}
printf(")");
}
printf("\n %d = number of digits in repeating cycle\n",cnt);
printf("\n");
}
return 0;
}