您的位置:首页 > 其它

usaco ★Fractions to Decimals 分数化小数

2016-11-20 10:56 176 查看
★Fractions to Decimals 分数化小数

写一个程序,输入一个形如 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)

PROGRAM NAME: fracdec

INPUT FORMAT

单独的一行包括被空格分开的 N 和 D, 1 <= N,D <= 100000。

SAMPLE INPUT  (file fracdec.in)

45 56

OUTPUT FORMAT

小数的表示方法上面说的很明白了,如果输出的长度超过 76 个字符,每行输出 76 个。

SAMPLE OUTPUT (file fracdec.out)
0.803(571428)

这是昨天补得三题最后一题也是第二章的最后一题,这题花了我太长时间在输出格式上面,好烦交了11次。

还有一题比这个难考数学,不考格式的有兴趣的可以尝试一下:点击打开链接代码我也放上来解释在我前面的一篇文章有很详细。

usaco题目。
/*
ID:jinbo wu
TASK:fracdec
LANG:C++
*/
#include<bits/stdc++.h>
using namespace std;
int v[100005];
char a[1000000];
char  b[10000];
int gcd(int n,int m)
{
return m==0?n:gcd(m,n%m);
}
int main()
{
freopen("fracdec.in","r",stdin);
freopen("fracdec.out","w",stdout);
int n,m,flag;
cin>>n>>m;
int temp=gcd(n,m);
n/=temp;
m/=temp;
temp=n/m;
int l=0;
do
{
b[++l]=48+temp%10;
temp/=10;
}while(temp);
for(int i=1;i<=l;i++)
a[i]=b[l-i+1];
a[++l]='.';
int cnt=l;
v[n%m]=++l;
n=(n%m)*10;
a[l]=48+(n/m)%10;
while(1)
{
temp=n%m;
if(v[temp])
{
flag=v[temp];
if(temp==0)
{
flag=0;
if(l-cnt>1)
l--;
}
break;
}
v[temp]=++l;
n=(n%m)*10;
int t=(n/m)%10;
a[l]=48+t;

}
int len=1;
int k=l;
cnt=0;
for(int i=1;i<=l;i++)
{
if(flag!=0)
{

if(len==flag)
{
cout<<"(";
cnt++;
if(cnt%76==0)
cout<<endl;
}
cout<<a[len];
cnt++;
if(len==l)
{
cout<<")";
cnt++;
if(cnt%76==0)
cout<<endl;
}
len++;
if(cnt%76==0)
cout<<endl;
}
else {
cout<<a[len++];
if((len-1)%76==0)
cout<<endl;
}
}
cout<<endl;

}


循环节长度
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
ll pow(ll n,ll m,ll q)
{
ll ans=1;
while(m)
{
if(m&1)
ans=ans*n%q;
n=n*n%q;
m>>=1;
}
return ans;
}
ll euler(ll n)
{
ll ans=n;
for(ll i=2;i*i<=n;i++)
{
if(n%i==0)
{
n/=i;
ans=ans/i*(i-1);
}
while(n%i==0) n/=i;
}
if(n>1)
ans=ans/n*(n-1);
return ans;
}
int main()
{
ll p,q;
while(~scanf("%lld %lld",&p,&q))
{
q/=gcd(p,q);
while(q%2==0) q/=2;
while(q%5==0) q/=5;
if(q==1)
{
printf("0\n");
continue;
}
ll t=euler(q);
ll temp=sqrt(t);
int flag=0;
for(ll i=1;i<=temp;i++)
{
if(t%i) continue;
if(pow(10,i,q)==1)
{
printf("%lld\n",i);
flag=1;
break;
}
}
if(flag)
continue;
for(int i=temp;i>=1;i--)
{
if(t%i) continue;
if(pow(10,t/i,q)==1)
{
printf("%lld\n",t/i);
break;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: