精华内容
下载资源
问答
  • 循环小数

    2020-05-13 18:30:00
    给定一个分数,判断其是否是一个无限循环小数,并输出它的第一个循环节。 例如:分数 1/3 是一个无限循环小数,第一个循环节为 3;而 2/5 不是一个无限循环小数。 输入格式 不多于 100 行,每行一个 m/n 形式的分数...

    给定一个分数,判断其是否是一个无限循环小数,并输出它的第一个循环节。

    例如:分数 1/3 是一个无限循环小数,第一个循环节为 3;而 2/5 不是一个无限循环小数。

    输入格式
    不多于 100 行,每行一个 m/n 形式的分数(0<m<n<100000)

    输出格式
    对于每一个分数,当其是一个无限循环小数时,输出它的第一个循环节;否则输出 0。每行的最后有一个换行符。

    样例
    input
    1/3
    2/5
    16/30
    4/7
    1/99
    output
    3
    0
    3
    571428
    01

    提示
    4/7的计算过程: 4/7=0余4,即结果为0余数为4; 410=40、40/7=5余5,即结果为0.5余数为5; 510=50、50/7=7余1,即结果为0.57余数为1; 110=10、10/7=1余3,即结果为0.571余数为3; 310=30、30/7=4余2,即结果为0.5714余数为2; 210=20、20/7=2余6,即结果为0.57142余数为6; 610=60、60/7=8余4,即结果为0.571428余数为4; 由于在计算过程中余数4出现过,后面的计算过程即将重复,即找到了循环节571428。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int main() {
        char c;
        int m, n, i;
        while (scanf("%d/%d", &m, &n) != EOF) {
            int nums[100001] = {0};
            string res = {}, ans;
            i = 1;
            nums[m] = i++;
            int left;
            while (m != 0) {
                m *= 10;
                left = m / n;
                res += to_string(left);
                m = m % n;
                if (nums[m]) {
                //注意此处循环的上下界
                    for (int j = nums[m]-1; j < i-1; j++)
                        printf("%c",res[j]);
                    printf("\n");
                    break;
                }
                else {
                    nums[m] = i++;
                }
            }
            if (m==0) printf("0\n");
        }
    }
    
    

    变式题:分数的精确值

    计算机内部表示的浮点数只有有限的精确位数。现在要找一种方法,使一个分数的精确值能够被表示为十进制小数,如果是一个无限循环小数,则指出它从哪一位到哪一位是循环节。

    输入格式
    第 1 行:整数 () 为问题数

    第 2 ∽ T+1 行:每行为每一个问题中的用一个空格分隔的分子 n 和分母 m ()。

    输出格式
    对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等),然后在一行中输出精确值小数(无循环)或一个小数直到第一个循环节结束。如果有循环,则在下一行中以两个整数表示从哪一位到哪一位是循环节,中间用一个 “-” 号分隔。

    样例
    input
    2
    2 4
    47 48
    output
    case #0:
    0.5
    case #1:
    0.97916
    5-5

    大佬思路:利用hash存储。

    #include <cstdint>
    #include <iostream>
    #include <unordered_map>
    
    int main() {
        using u32 = uint32_t;
        u32 t;
        std::cin >> t;
        for (u32 i = 0; i != t; ++i) {
            u32 n, m;
            std::cin >> n >> m;
            std::cout << "case #" << i << ":\n" << n / m;//输出整数部分
            n = n % m * 10;
            if (!n) {
                std::cout << '\n';
                continue;
            }
            std::cout << '.';
            using BitPos = u32;
            using Dividend = u32;
            u32 bit_cnt = 1;
            std::unordered_map<Dividend, BitPos> table{{n, bit_cnt}};//被除数,以及其出现位数
            do {
                std::cout << n / m;
                n = n % m * 10;
                if (auto [it, ok] = table.insert({n, bit_cnt += 1}); !ok) {
                    std::cout << '\n' << it->second << '-' << bit_cnt - 1;
                    break;
                }
            } while (n);
            std::cout << '\n';
        }
    }
    
    展开全文
  • 一、纯循环小数化分数从小数点后面第一位就循环的小数叫做纯循环小数。怎样把它化为分数呢?看下面例题。把纯循环小数化分数:纯循环小数的小数部分可以化成分数,这个分数的分子是一个循环节表示的数,分母各位上的...

    一、纯循环小数化分数

    从小数点后面第一位就循环的小数叫做纯循环小数。怎样把它化为分数呢?看下面例题。

    把纯循环小数化分数:

    纯循环小数的小数部分可以化成分数,这个分数的分子是一个循环节表示的数,分母各位上的数都是9。9的个数与循环节的位数相同。能约分的要约分。

    二、混循环小数化分数

    不是从小数点后第一位就循环的小数叫混循环小数。怎样把混循环小数化为分数呢? 把混循环小数化分数。

    先看小数部分0.353

    一个混循环小数的小数部分可以化成分数,这个分数的分子是第二个循环节以前的小数部分组成的数与小数部分中不循环部分组成的数的差。分母的头几位数是9,末几位是0。9的个数与循环节中的位数相同,0的个数与不循环部分的位数相同。

    三、循环小数的四则运算

    循环小数化成分数后,循环小数的四则运算就可以按分数四则运算法则进行。从这种意义上来讲,循环小数的四则运算和有限小数四则运算一样,也是分数的四则运算。

    有限小数化成分数直接将小数点去掉,分母对应化成十百千万等。再约分。

    例如:0.333.....=3/9=1/3

    0.214214214214214....=214/999

    简单说每一个循环节为分子,循环节有几位数分母就写几个9

    0.3333......循环节为3 0.214.....循环节为214

    0.52525252....循环节为52,所以0.525252...=52/99

    0.35....=35/99

    展开全文
  • 无限循环小数和无限不循环小数

    千次阅读 2016-06-21 16:20:01
    无限不循环小数 任何分数转换为小数,要么为有限小数,要么是无限循环小数。 0. 有理数和无理数无理数:无限不循环小数,和开根开不尽 有理数:整数和分数(有限小数,无限循环小数)1. 无限循环小数17=0....

    小数的分类:

    • 有限小数
    • 无限小数
      • 无限循环小数
      • 无限不循环小数

    任何分数转换为小数,要么为有限小数,要么是无限循环小数

    0. 有理数和无理数

    无理数:无限不循环小数,和开根开不尽
    有理数:整数和分数(有限小数,无限循环小数)

    1. 无限循环小数

    17=0.142875142875

    2. 无限不循环小数

    制造无限不循环小数:

    0.1212212221222221

    每一循环节中,2 的数目比前一个多 1.

    几乎所有的小数都是无理数。

    展开全文
  • 自创算法读取循环小数小数部分,还包括获取字符串所有子集。
  • 循环小数性质及证明

    2017-07-27 09:34:38
    循环小数的性质及证明
  • 循环小数

    2014-10-31 15:44:36
    对于任意的真分数 N/M ( 0 ),均可以求出对应的小数。如果采用链表表示各个小数,对于循环节采用循环链表表示,则所有分数均可以表示为如下链表形式。
  • 循环小数参考.doc

    2021-09-19 23:52:06
    循环小数参考.doc
  • 3.4 循环小数.docx

    2021-09-08 22:08:45
    3.4 循环小数.docx
  • 循环小数 uva202

    2017-01-11 18:06:14
    题目名称:循环小数题目描述:输入整数a和b a大于等于0小于等于3000,b大于等于1小于等于3000,输出a/b的循环小数表示以及循环节长度。如果循环周期大于50,只显示50位,之后的全部用……表示样例:Alt text 题目分析...

    题目名称:循环小数

    题目描述:

    输入整数a和b a大于等于0小于等于3000,b大于等于1小于等于3000,输出a/b的循环小数表示以及循环节长度。如果循环周期大于50,只显示50位,之后的全部用……表示

    样例:

    Alt text
    题目分析:
    ①所谓的循环小数,也就是我们理解的当每步作除法时候,会出现了重复的商,那个循环小数的周期肯定就在两个重复的商之间。
    ②现在就转化为类似于找周期的问题了,找重复出现的商,我们最常见想到的办法就是记录所有的商,每算出一个新的商,之后就顺序查找看该商是否出现过,这就比较复杂了,复杂度为O(n^2)
    ③改进方法就是我们可以考虑用一个数组记录某个商是否出现过,这样来做复杂度就为O(n)
    ③我们需要设置的变量
    输入:分子numerator 分母denominator
    商 quotient
    商的整数部分 integer
    商的小数部分 digits[]
    余数是否存在 reminder_exist[]
    余数存在的位置 reminder_pos
    商是否存在循环 found_cycle
    商的小数部分开始循环的位置 cycle_pos
    循环的长度 cycle_len
    循环长度的限制 display_limit

    算法思路

    a)首先我们要表示商的小数点左边的部分,并且由于分子一直在变化,所以我们要设置一个新的变量保存下初始的分子,方便之后的输出

    b)查找循环,由简单的数学知识可知,如果某两步计算的余数相等,那么他们之间的这些计算就是属于我们的循环小数了,所以我们需要就是找每步计算余数相等的,我们要知道他们分别的位置,这里我们采用两个数组来区分一个是reminder_exist[]这里保持,哪个余数存在,对应的值就为1,所以我们可以通过检测这个数组的值来找循环,之后因为我们还需要之前第一次出现这个循环的位置,所以我们还需要有一个数组保存第几次运算出现哪个余数。之后再用第二次出现计算次数减去第一次出现的次数,我们就可以得到循环节的长度了。而且每一步计算得到的商需要保存在一个数组中,这里命名为digits

    c)最后再比较下计算最后一次与50进行比较,来按要求输出。
    学习笔记:

    本题最核心的算法在于,我们怎么去找出循环小数的循环体个数了,循环体初始位置和最后位置。

    通过数学知识可以知道找余数相同的时候,每次计算得到的余数放在一个数组中,且数组对于位置为1,代表存在这个余数,之后再通过一个循环找这个位置为1的时刻,这就是余数相同的时候,并且用一个数组保存计算的次数,取每次计算得到的商保存在digits[]中,所以每次余数对应三个数组的值分别问商、计算次数、是否存在的。

    //.c
    #include <stdio.h>
    #include <string.h>
    #define maxn 100
    #define display_limit 50
    #define max_INT 10000
    
    int digits[maxn];
    int reminder_exist[max_INT];
    int reminder_pos[max_INT];
    
    int main()
    {
        int numerator,denominator,quotient,reminder;
        while(scanf("%d%d", &numerator, &denominator) != EOF && denominator)
        {
            //初始化数组和商的整数部分
            int original_numerator = numerator;
            memset(reminder_exist, 0, sizeof(reminder_exist));
            memset(reminder_pos, 0, sizeof(reminder_pos));
            quotient = numerator/denominator;
            reminder = numerator%denominator;
            int integer = quotient;
    
            //找出循环
            int found_cycle = 0;
            int cycle_pos = maxn;
            int cycle_len = 0;
            int i = 0;
    
            for(i = 0; i <= maxn; i++)
            {
                if(reminder_exist[reminder])
                {
                    cycle_pos = reminder_pos[reminder];
                    cycle_len = i - cycle_pos;
                    break;
                }
                else
                {
                    reminder_exist[reminder] = 1; 
                    reminder_pos[reminder] = i;
                }
    
                numerator = reminder * 10;
                quotient = numerator/denominator;
                reminder = numerator%denominator;
    
                digits[i] = quotient;
            }
    
            //输出
            printf("%d/%d = %d.(",original_numerator, denominator, integer);
            if(i <= display_limit)
            {
                for(int j = cycle_pos; j < i; j++)
                {
                    printf("%d", digits[j]);
                }
            }
            else
            {
                for(int j = cycle_pos; j < display_limit;j++)
                    printf("%d", digits[j]);
                printf("...");
            }
            printf(")\n");    
            printf("%d = number of digits in repeating cycle\n", cycle_len);
        }
        return 0;
    }
    展开全文
  • 循环小数循环节

    千次阅读 2018-02-07 15:10:47
    任何有理数都可以表示为无限循环小数的形式。   本题目要求即是:给出一个数字的循环小数表示法。   例如: 输入: 1,5 则输出: 0.2   输入: 1,7 则输出: 0.[142857]   输入: 7...
  • /* 有理循环小数 1/7 = 0.142857142... 是个无限循环小数。 任何有理数都可以表示为无限循环小数的形式。 本题目要求即是:给出一个数字的循环小数表示法。 例如: 输入: 1,5 则输出: 0.2 输入: 1,7 则输出: 0....
  • 循环小数表示法

    2019-10-04 01:15:59
    整数输入有理循环小数 1/7 = 0.142857142... 是个无限循环小数。 任何有理数都可以表示为无限循环小数的形式。 本题目要求即是:给出一个数字的循环小数表示法。 这段时间个人几篇文章介绍了改整数输入的文章...
  • 循环小数知识要点.doc

    2021-09-12 03:12:14
    循环小数知识要点.doc
  • 循环小数-康明昌

    2017-08-22 08:38:53
    讲解循环小数的数学规律
  • 无限循环小数转化分数

    千次阅读 2018-08-09 10:52:47
    给出一个无限循环小数以及循环节,求原最简分数,例如输入 5.3 1 表示从小数点后一位开始循环,也就是循环小数是5.33333….. 输出结果是 16/3 分析 其实一个简单的数学结论就可以解决这个问题, 循环节有几位,...
  • 循环小数问题

    千次阅读 2012-05-08 10:44:13
    任何有理数都可以表示为无限循环小数的形式。 本题目要求即是:给出一个数字的循环小数表示法。 例如: 输入: 1,5 则输出: 0.2 输入: 1,7 则输出: 0.[142857] 输入: 7,6 则输出: 1.1[6] 用户...
  • 一、纯循环小数化分数从小数点后面第一位就循环的小数叫做纯循环小数。怎样把它化为分数呢?看下面例题。把纯循环小数化分数:纯循环小数的小数部分可以化成分数,这个分数的分子是一个循环节表示的数,分母各位上的...
  • 今天学习了把分数化为循环小数,以下代码实现的功能是:输入m/n,假设m能被n整除,则直接输出商;否则,输出商以后再输出循环节。 #include<cstdio> #include<cstring> const int MAXN = 100005; int...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 109,495
精华内容 43,798
关键字:

循环小数是什么