2020-11-14

该博客介绍了如何用C++的vector容器判断一个真分数的无限小数部分是否循环。通过不断求商和余数,将小数部分转化为整数序列存储在vector中,并检查序列是否存在循环模式。程序逻辑清晰,适用于基础的算法学习。
摘要由CSDN通过智能技术生成

c++ vector容器学习

判断一个真分数是无限循环还是无限不循环

#include<iostream>
#include<vector>
/*向量是一个封装了动态大小数组的顺序容器,跟任意其他类型的容器一样,它能够存放各种类型的对象。
可以简单地认为,向量是一个能够存放任意类型的动态数组*/
using namespace std;

int main()
{
    int flag2;
    do
    {
        int numer;//分子
        int denom;//分母
        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;//声明两个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素
        while (!flag1 && remainder)
        {
            quotient = int(remainder * 10 / denom);
            remainder = (remainder * 10) % denom;
            v.push_back(quotient);
            
            if (v.size()> denom && beg == end)//v.size得到当前使用容器的大小 //容器长度大于分母但仍然不出现循环时,就不可能再出现循环了//
                {cout<<"v.size() "<<v.size()<<endl;
                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;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值