今天学习了把分数化为循环小数,下面代码实现的功能是:输入m/n,如果m能被n整除,则直接输出商;否则,输出商以后再输出循环节。
#include<cstdio>
#include<cstring>
const int MAXN = 100005;
int a[MAXN], vis[MAXN];
int main()
{
int n, t, i, m;
scanf("%d",&t);
while(t--)
{
memset(vis, 0, sizeof(vis));
scanf("%d/%d",&m,&n);
if(m > 0 && n < 0)
{
printf("-");
n = -n;
}
else if(m < 0 && n > 0)
{
printf("-");
m = -m;
}
if(m % n == 0)
{
printf("%d\n",m/n);
continue;
}
else
{
if(m > n)
{
printf("%d.",m/n);
m = m % n;
}
else
printf("0.");
}
int s = m, num = 0;
vis[s] = 1;
while(1)
{
s *= 10;
a[num++] = s / n;
s %= n;
if(vis[s] || s == 0) break; //余数再次出现或者余数为0(即可以整除)
vis[s] = 1;
}
for(i = 0; i < num; i++)
printf("%d", a[i]);
printf("\n");
}
return 0;
}
// 求a/b
// 若能整除或者为有限小数,则直接输出商
// 若不能整除,则输出包含一个循环节的商,其中循环节用()括起来
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int a, b;
while(cin >> a >> b) {
if(a % b == 0) { // 可以整除
cout << a / b << endl;
continue;
}
vector<int> quotient; // 商
vector<int> remainder; // 余数
quotient.push_back(a / b);
remainder.push_back(a % b);
int index = 0;
int flag = 0;
int start_pos, end_pos;
while(1) {
++index;
quotient.push_back(remainder[index - 1] * 10 / b);
int current_remainder = remainder[index - 1] * 10 % b;
if(current_remainder == 0) { // 有限小数
flag = 1;
break;
}
else { // 无限循环小数
vector<int>::iterator it = find(remainder.begin(), remainder.end(), current_remainder);
if(it != remainder.end()) { // 出现相同的余数,即第二次出现循环节
start_pos = it - remainder.begin() + 1;
end_pos = index; remainder.push_back(current_remainder);
break;
}
else
remainder.push_back(current_remainder);
}
}
cout << quotient[0] << ".";
if(flag) {
for(int i = 1; i <= index; ++i)
cout << quotient[i];
cout << endl;
}
else {
for(int i = 1; i < start_pos; ++i)
cout << quotient[i];
cout << "(";
for(int i = start_pos; i <= index; ++i)
cout << quotient[i];
cout << ")" << endl;
cout << "start_pos = " << start_pos << endl;
cout << "end_pos = " << end_pos << endl;
cout << "length = " << end_pos - start_pos + 1 << endl;
}
}
return 0;
}
把循环小数化为分数的方法:对于纯循环小数(从小数点后第1位开始循环)x,假设循环节为R,它包括l个数字,则有10^l*x - x = R,因此x = R/(10^l - 1)。
例如,若x = 0.123 123 123…,则R = 123, l = 3, 因此x = 123/999 = 41/333。