题目描述 Description
写一个程序,输入一个形如 N/D 的分数(N 是分子,D 是分母),输出它的小数形式。
如果小数有循环节的话,把循环节放在一对圆括号中。例如,
1/3 = .33333333 写成 0.(3)
41/333 = 0.123123123… 写成 0.(123)
用 xxx.0 成表示整数
典型的转化例子:
1/3 = 0.(3)
22/5 = 4.4
1/7 = 0.(142857)
2/2 = 1.0
3/8 = 0.375
45/56 = 0.803(571428)
输入描述 Input Description
一行两个整数N和D
他们均大于0小于100 000
输出描述 Output Description
如描述所说的那样。
如果转化出的长度超过76个字符,每行输出76个
题解 Analysis
换回win10不爽不爽不爽(┬_┬)
举几个例子可以发现,有循环节的小数在作除法过程中会出现重复的余数
于是就愉快地用桶记录一下,然后模拟除法往后算
输出坑得一B,不过只要保证最后只有一个换行就可以了
每行七十六个输出也是微醺,无力吐槽
程序 Code
/*
ID:wjp13241
PROG:fracdec
LANG:C++
*/
#include <stdio.h>
#include <queue>
using namespace std;
struct frac
{
int mr,dr;
};
queue<frac>q;
int t[100001];
int main()
{
freopen("fracdec.in","r",stdin);
freopen("fracdec.out","w",stdout);
int a,b,st,ed,v=1,cnt=0;
scanf("%d%d",&a,&b);
printf("%d.",a/b);
q.push((frac){a,b});
while (q.size())
{
frac now=q.front();q.pop();
int tmp=now.mr%now.dr;
if (!t[tmp])
{
q.push((frac){tmp*10,now.dr});
t[tmp]=++cnt;
}
else
{
st=t[tmp];
ed=cnt-st;
break;
}
}
int tmp=a/b;
do{v++;}while (tmp/=10);
a%=b;
if (!a)
printf("0");
while (--st)
{
printf("%d",a*10/b);
a=a*10%b;
++v%=76;
if (!v)
printf("\n");
}
if (a)
{
printf("(");
++v%=76;
if (!v)
printf("\n");
while (ed--)
{
printf("%d",a*10/b);
a=a*10%b;
++v%=76;
if (!v)
printf("\n");
}
printf("%d)",a*10/b);
}
printf("\n");
return 0;
}