-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathk进制的小数.cpp
87 lines (81 loc) · 1.65 KB
/
k进制的小数.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//encoding: GB2312
//still working on negative k
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x, y, k, len;
map<ll, ll> occur;
ll quot(ll n, ll k) {
if (k > 0) {
return (n > 0 ? n / k : (n-k+1) / k);
}
else {
return (n > 0 ? n / k : (n+k+1) / k);
}
}
ll mod(ll n, ll k) {
if (k > 0) {
ll q = (n > 0 ? n / k : (n-k+1) / k);
return n - q * k;
}
else {
ll q = (n > 0 ? n / k : (n+k+1) / k);
return n - q * k;
}
}
ll cnt(ll x) {
ll res = 0;
while (x > 0) {
++res;
x /= 10;
}
return res;
}
void putnum(ll x) {
if (x == 0) return;
putnum(quot(x, k));
if (mod(x, k) >= 10) {
cout << '(' << mod(x, k) << ')';
len += cnt(mod(x, k)) + 2;
}
else {
cout << mod(x, k);
++len;
}
}
int main() {
cout << "输入x,y,k,输出x/y在k进制下的小数形式(打波浪线的是循环节,若小数某位大于9,就会打上括号)" << endl;
cin >> x >> y >> k;
if (x < y) {
cout << '0';
len = 1;
}
else {
putnum(x / y);
}
x = mod(x, y) * k;
if (x == 0) {
return 0;
}
cout << '.';
++len;
while (!occur[x] && x) {
occur[x] = len;
if (mod(quot(x, y), k) >= 10) {
cout << '(' << mod(quot(x, y), k) << ')';
len += cnt(mod(quot(x, y), k)) + 2;
}
else {
cout << mod(quot(x, y), k);
++len;
}
x = mod(x, y) * k;
}
if (x == 0) return 0;
cout << endl;
for (ll j = 1; j <= len; j++) {
cout << (j <= occur[x] ? ' ' : '^');
}
cout << endl;
return 0;
}