版权声明:本人菜鸟一只,如文章有错误或您有高见,请不吝赐教 https://blog.csdn.net/qq_41138935/article/details/82631836
我是利用比较字符串相等找出循环字长的,内存消耗大,时间复杂度高,原谅我是数学渣渣。
ps:建议利用余数相等找循环字长,有时间再更!
#include<iostream>
#include<cstring>
using namespace std;
int arr[1005];
int main(){
int a,b,i=0,j,k,t;
cin>>a>>b;
//-------好像不需要这个
if(a==0){ //特判
cout<<0;
}
while(a>b){
arr[i]=a/b;
a%=b;
cout<<arr[i];
}
if(a%b==0){
cout<<"小数表示为0 \t循环节长度为1";
return 0;
}
//---------以上代码可能多余
while(a%b!=0&&i<1005){
if(a<b){
a*=10;
}
arr[i++]=a/b;
a%=b;
}
int lena=sizeof(arr)/sizeof(arr[0]);
for(t=1;t<lena;t++){
k=t;
for(j=0;j<lena;j++){
if(arr[k]==arr[j]){
k++;
if(j>=900){ //想把900换成lena的,可是好像精度有问题,判断不相等
break;
}
continue;
}else{ //不相等
break;
}
}
if(j>=900){
break;
}
}
cout<<"\n"<<t<<endl;
for(int q=0;q<t;q++){
cout<<arr[q];
}
return 0;
}
利用余数判断
#include<iostream>
#include<cstring>
using namespace std;
#define MAX 1005
int arr[MAX];
int yu[MAX];
int main(){
int a,b;
int i=0,j=0,len=0;
int reLen,reBeg;
cin>>a>>b;
int zs=a/b;
for(i=0;i<MAX;i++){
if(i==0){
yu[0]=a%b;
}else{
yu[i]=yu[i-1]*10%b;
}
arr[i]=yu[i]*10/b;
len++;
for(j=0;j<i;j++){
if(yu[i]==yu[j]){
len--;
reLen=i-j;
reBeg=j;
i=MAX;
break;
}
}
}
cout<<zs<<".";
for(int t=0;t<reBeg+reLen;t++){
if(t==reBeg){
cout<<"(";
}
cout<<arr[t];
}
cout<<")\n"<<reLen;
return 0;
}