习题3-8 循环小数

版权声明:本人菜鸟一只,如文章有错误或您有高见,请不吝赐教 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;
} 

猜你喜欢

转载自blog.csdn.net/qq_41138935/article/details/82631836