小数转为分数

从实验报告中选取出来的比较有意思的问题:
从键盘输入分子b和分母a,判断该分数(真分数)是否是无限循环小数,并给出循环开始出现的位数。验证如下结论是否正确:
(对于分数b/a,小数点至多a位, 或a位之内开始出现无限循环。)
例如:
3/8 = 0.375 //小数点不超过7位(有限小数)
1/3 = 0.333333…//从1位开始出现无限循环
1/7 = 0.142857 142857 142857 //6位开始(7位内)出现循环序列:142857
6/7 = 0.857142 857142 857142 //6位开始(7位内)出现循环序列:857142
(试试神奇的分数1/49和100/9801,100/9899)
提示:
假设分数是3/8=0.375
小数第1位上的数字是30/8的商,就是表达式30/8的值:3
30%8(求余)的值是6,那么 小数第2位上的数字是60/8的值:7
60%8(求余)的值是4,那么,小数第3位上的数字是40/8的值5



#include<iostream>

#include<vector>

using namespace std;

 

int main() {

    int
flag2;

    do
{

        int
denom, numer;

        cout
<< "请输入分子和分母: ";

        cin
>> numer >> denom;

 

        while(numer
>= denom) {

            cout
<< "输入错误!请重新输入!" << endl;

            cout
<< "请输入分子和分母: ";

            cin
>> numer >> denom;

        }

 

        int
flag1 = 0;  

        int
remainder = (numer * 10) % denom; 

        int
quotient = int(numer * 10 / denom);    

        vector<int>
v;

        v.push_back(quotient);

 

        int
beg = 0;

        int
end = 0;

        vector<int>::iterator
iter, iter1;

 

        while(!flag1
&& remainder) {

            quotient
=  int(remainder * 10 / denom);

            remainder
= (remainder * 10) % denom;

            v.push_back(quotient);

            if(v.size()
> denom && beg == end)

                break;

            else
{

                if(beg
== end) {          

                   for(iter
= v.begin(); iter != v.end() - 1; iter++) {

                       if(*iter
== v.back()) {

                           beg
= iter - v.begin();   

                           end
= v.end() - v.begin();

                           break;

                       }

                   }

                }
else {                                

                   iter
= v.begin();

                   iter1
= iter + beg + (v.end() - v.begin()) - end;

                   if(*iter1
!= v.back())                

                       beg
= end = 0;

                   else
if(iter1 == v.begin() + end)     

                       flag1
= 1;

                }

            }

 

        }

 

        if(remainder
== 0)

            cout
<< "有限小数!\n";

        else
if(flag1 == 0)

            cout
<< "无限但不循环小数!\n";

        else

           cout
<< "无限循环小数! 且循环区间开始的位置为 " << end - 1 << endl;

        cout
<< "---------------------------------------------\n"; 

        cout
<< "是否继续判断循环,如果是,请输入1, 否则0: ";

        cin
>> flag2;

    }
while(flag2);

    return
0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值