输出循环小数

刚刚在博客园看到的一个题,写出来,留作备份,两个整数a和b,输出他们的商,循环小数要加括号。

example:

1/3 输出 0.(3)

2/8 输出 0.25

23/6 输出 3.8(3)

 

思路:
两个数组,一个存储商,一个存储余数,前者用于检查余数是否重复出现,后者用来输出小数部分。

1. 能整除的直接输出
2. 否则,一直除,直到余数为0或者余数重复出现。输出所有的小数部分即可,两次余数出现之间的加上括号

代码:

ExpandedBlockStart.gif 代码
 1  #include  < iostream >
 2  using   namespace  std ;
 3 
 4  //  检查余数curValue是否在以前出现过,以前的余数保存在数组a中,如果重复出现,返回其第一次出现的位置,否则返回-1
 5  int  Check( int  a[],  int  maxIndex,  int  curValue)
 6  {
 7       for  ( int  i  =   0 ; i  <  maxIndex ; i ++ )
 8      {
 9           if (a[i]  ==  curValue)
10               return  i ;
11      }
12       return   - 1  ;
13  }
14 
15  //  主函数
16  //  i是存放余数的数组,f是存放商的数组
17  void  Fraction( int  i[],  int  f[],  int  a,  int  b)
18  {
19       //  能整除,直接输出并返回
20       if (a  %  b  ==   0 )
21      {
22          cout  <<  a  /  b  <<  endl ;
23           return  ;
24      }
25 
26       //  输出整数部分
27      cout  <<  a  /  b  <<   " . "  ;
28 
29       int  c  =   0  ;  //  数组下标
30       int  t  =  a  %  b ;
31      i[c]  =  t ;     //  第一个余数
32       while  ( true )
33      {
34           if  (t  <  b)
35              t  *=   10  ;         //  余数乘10,进行下一次
36          f[c]  =  t  /  b ;         //  存储商
37          i[ ++ c]  =  t  %  b ;     //  存储余数
38          t  %=  b ;             //  除
39 
40           if  (t  ==   0 // 除尽,输出后返回
41          {
42               for  ( int  j  =   0 ; j  <  c; j ++ )
43              {
44                  cout  <<  f[j] ;
45              }
46              cout  <<  endl ;
47               return  ;
48          }
49 
50           else
51          {
52               //  检查余数是否在之前出现过
53               int  r  =  Check(i, c, t  %  b) ;
54 
55               //  如果本次余数之前出现过,表明循环开始了
56               if (r  !=   - 1 )
57              {
58                   //  输出常规小数部分
59                   for  ( int  j  =   0 ; j  <  r; j ++ )
60                      cout  <<  f[j] ;
61 
62                  cout  <<   " ( "  ;
63 
64                   //  输出循环小数部分
65                   for  ( int  j  =  r; j  <  c; j ++ )
66                      cout  <<  f[j] ;
67 
68                   break  ;
69              }
70          }
71      }
72 
73      cout  <<   " ) "   <<  endl ;
74  }
75 
76  int  main( void )
77  {
78       const   int  n  =   100  ;
79       int  i[n] ;  //  存储商的数组
80       int  f[n] ;  //  存储余数的数组
81 
82      Fraction(i, f,  11 61 ) ;
83 
84      system( " pause " ) ;
85       return   0  ;
86  }

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值