- //题目略。。。
- #include "stdafx.h"
- #include<iostream>
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- bool Found=false;//是否找到循环
- int m,n;//m被除数,n为除数
- int len;//循环节长度
- int Temp[1000];
- int temp=0;
- cin>>m>>n;
- //小数点前值
- if(m>=n)
- {
- temp=m/n;
- m=m%n;
- }
- int i=0;//小数点后位数标记
- while(Found==false && m)
- {
- m*=10;//扩大10倍
- Temp[i++]=m/n;
- m=m%n;//余数
- for(int j=i-2;j>=0;j--)
- {
- //找到与当前数字一致的位
- if(Temp[j]==Temp[i-1])
- {
- if(i-1-j<=j+1)//截断位置两边长度
- {
- len=i-1-j;//可能循环的长度
- bool AllSame=true;
- for(int k=0;k<len;k++)
- {
- if(Temp[i-1-k]!=Temp[j-k]){
- AllSame=false;
- break;
- }
- }
- if(AllSame==true)
- {
- //存在可能循环点
- int Next=m*10/n;
- if(Next==Temp[j+1])//确保为循环(避免100/17这种情况)
- Found=true;
- }
- }
- else
- {
- //长度不满足,不可能存在循环
- }
- }
- if(Found==true)break;//已经找到循环
- }//end_of_for
- }
- if(Found==true)
- {
- //为无限循环数
- char AD,Temp1[1000];
- int Length=0;
- if(temp==0)
- {
- Temp1[Length++]='0';
- }
- else if(temp>0)
- {
- while(temp>0)
- {
- Temp1[Length++]=temp%10+'0'-0;
- temp/=10;
- }
- //高低位互换
- for(int k=0;k<Length/2;k++)
- {
- AD=Temp1[Length-1-k];
- Temp1[Length-1-k]=Temp1[k];
- Temp1[k]=AD;
- }
- }
- if(i>0)
- {
- //存在小数位
- Temp1[Length++]='.';//加入小数点
- for(int k=0;k<=i-len-len-1;k++)
- Temp1[Length++]=Temp[k]+'0'-0;//加入循环前的数
- Temp1[Length++]='(';
- for(int k=i-len-len;k<i-len;k++)
- Temp1[Length++]=Temp[k]+'0'-0;
- Temp1[Length++]=')';
- }
- //output
- for(int k=0;k<Length;k++)
- cout<<Temp1[k];
- cout<<endl;
- }
- else
- {
- //非循环数
- char AD,Temp1[1000];
- int Length=0;
- if(temp==0)
- {
- Temp1[Length++]='0';
- }
- else if(temp>0)
- {
- while(temp>0)
- {
- Temp1[Length++]=temp%10+'0'-0;
- temp/=10;
- }
- //高低位互换
- for(int k=0;k<Length/2;k++)
- {
- AD=Temp1[Length-1-k];
- Temp1[Length-1-k]=Temp1[k];
- Temp1[k]=AD;
- }
- }
- if(i>0){
- Temp1[Length++]='.';//加入小数点
- for(int k=0;k<i;k++)
- {
- Temp1[Length++]=Temp[k]+'0'-0;
- }
- }
- //output
- for(int k=0;k<Length;k++)
- cout<<Temp1[k];
- cout<<endl;
- }
- cin>>i;
- return 0;
- }
循环小数
最新推荐文章于 2014-12-10 23:01:40 发布