有理数的循环节
时间: 1ms 内存:128M
描述:
1/7 = 0.142857142... 是个无限循环小数。
任何有理数都可以表示为无限循环小数的形式。本题目要求即是:给出一个数字的循环小数表示法。
输入:
用户输入的格式是:
整数,整数每个整数范围均为:1~1000
输出:
程序输出两个整数做除法产生的小数或无限循环小数(循环节用方括号括起)。
示例输入:
1,5
示例输出:
0.2
提示:
参考答案(内存最优[1096]):
#include<stdio.h>
int main()
{
int a,b,i,j,k,l=0;
int t=0;
int ss[10000],s[10000];
scanf("%d%*c%d",&a,&b);
for(i=0;; i++)
{
s[i]=a/b;
ss[i]=a%b;
a=10*(a%b);
for(j=0; j<i; j++)
{
if(ss[i]==ss[j])
{
t=1;
break;
}
}
if(t==1)break;
}
printf("%d.",s[0]);
while(s[0]!=0)
{
s[0]=s[0]/10;
l++;
}
if(s[1]==0)printf("0");
else
{
for(k=1; k<=j; k++)
{
printf("%d",s[k]);
}
if(s[i]!=0)
{
printf("[");
for(; k<=i; k++)
{
printf("%d",s[k]);
}
printf("]");
}
}
return 0;
}
参考答案(时间最优[0]):
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int m,n;
int a[100]={0};
int num[100];
int point=0;
cin>>m;
getchar();
cin>>n;
bool label=true;
cout<<m/n;
m=m%n;
m*=10;
if(m==0)
return 0;
else
{
cout<<".";
while(label)
{
int i;
bool p=true;//判断是否循环,靠除数和被除数确定
for(i=0;i<point;i++)
{
if(m==a[i])
{
p=false;
}
if(p==false)
break;
}
if(p)//不循环,加入字符串,记录除数和被除数
{
if(m%n==0)
{
for(int k=0;k<point;k++)
cout<<num[k];
cout<<m/n<<endl;
return 0;
}
else
{
num[point]=m/n;
a[point]=m;
point++;
if(m<n)
m*=10;
else if(m>n)
{
m=m%n;
m*=10;
}
}
}
else//循环,输出字符串
{
for(int j=0;j<point;j++)
{
if(i==j)
cout<<"["<<num[j];
else cout<<num[j];
}
cout<<"]"<<endl;
label=false;
}
}
}
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。