循环小数

  1. //题目略。。。
  2. #include "stdafx.h"
  3. #include<iostream>
  4. using namespace std;
  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7.  bool Found=false;//是否找到循环
  8.  int m,n;//m被除数,n为除数
  9.  int len;//循环节长度
  10.  int  Temp[1000];
  11.  int temp=0;
  12.  cin>>m>>n;
  13.  //小数点前值
  14.  if(m>=n)
  15.  {
  16.   temp=m/n;
  17.   m=m%n;
  18.  }
  19.    
  20.  int i=0;//小数点后位数标记
  21.  while(Found==false && m)
  22.  {
  23.   m*=10;//扩大10倍
  24.         Temp[i++]=m/n;
  25.   m=m%n;//余数  
  26.   for(int j=i-2;j>=0;j--)
  27.   {
  28.    //找到与当前数字一致的位
  29.    if(Temp[j]==Temp[i-1])
  30.    {
  31.     if(i-1-j<=j+1)//截断位置两边长度
  32.     {
  33.                    
  34.      len=i-1-j;//可能循环的长度
  35.      bool AllSame=true;
  36.      for(int k=0;k<len;k++)
  37.      {
  38.       if(Temp[i-1-k]!=Temp[j-k]){
  39.        AllSame=false;
  40.        break;
  41.       }
  42.      }
  43.      if(AllSame==true)
  44.      {
  45.       //存在可能循环点
  46.       int Next=m*10/n;
  47.       if(Next==Temp[j+1])//确保为循环(避免100/17这种情况)
  48.        Found=true;
  49.      }
  50.     }
  51.     else
  52.     {
  53.      //长度不满足,不可能存在循环
  54.     }
  55.    }
  56.    if(Found==true)break;//已经找到循环
  57.   }//end_of_for  
  58.  }
  59.  if(Found==true)
  60.  { 
  61.   //为无限循环数
  62.   char AD,Temp1[1000];
  63.   int Length=0;
  64.   if(temp==0)
  65.   {
  66.    Temp1[Length++]='0';
  67.   }
  68.   else if(temp>0)
  69.   {
  70.    while(temp>0)
  71.    {
  72.     Temp1[Length++]=temp%10+'0'-0;
  73.     temp/=10;
  74.    }
  75.    //高低位互换
  76.    for(int k=0;k<Length/2;k++)
  77.    {
  78.     AD=Temp1[Length-1-k];
  79.     Temp1[Length-1-k]=Temp1[k];
  80.     Temp1[k]=AD;
  81.    }
  82.      }
  83.   
  84.   if(i>0)
  85.   {
  86.    //存在小数位
  87.    Temp1[Length++]='.';//加入小数点
  88.    for(int k=0;k<=i-len-len-1;k++)
  89.     Temp1[Length++]=Temp[k]+'0'-0;//加入循环前的数
  90.    Temp1[Length++]='(';
  91.    for(int k=i-len-len;k<i-len;k++)
  92.     Temp1[Length++]=Temp[k]+'0'-0;
  93.    Temp1[Length++]=')';
  94.   }
  95.   
  96.   //output
  97.   for(int k=0;k<Length;k++)
  98.    cout<<Temp1[k];
  99.   cout<<endl; 
  100.  }
  101.  else
  102.  {
  103.   //非循环数
  104.   char AD,Temp1[1000];
  105.   int Length=0; 
  106.   if(temp==0)
  107.   {
  108.    Temp1[Length++]='0';
  109.   }
  110.   else if(temp>0)
  111.   {
  112.    while(temp>0)
  113.    {
  114.     Temp1[Length++]=temp%10+'0'-0;
  115.     temp/=10;
  116.    }
  117.    //高低位互换
  118.    for(int k=0;k<Length/2;k++)
  119.    {
  120.     AD=Temp1[Length-1-k];
  121.     Temp1[Length-1-k]=Temp1[k];
  122.     Temp1[k]=AD;
  123.    }
  124.   }
  125.     
  126.   if(i>0){
  127.    Temp1[Length++]='.';//加入小数点
  128.    
  129.    for(int k=0;k<i;k++)
  130.    {
  131.     Temp1[Length++]=Temp[k]+'0'-0;
  132.    }
  133.   }
  134.   
  135.   //output
  136.   for(int k=0;k<Length;k++)
  137.    cout<<Temp1[k];
  138.   cout<<endl;
  139.  }
  140.  cin>>i;
  141.  return 0;
  142. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值