uva 202 Repeating Decimals 模拟

弱校连萌题目链接:http://acm.bnu.edu.cn/v3/contest_show.php?cid=5772#problem/G

需要先想到出现循环节意味着出现了以前出现过的余数

然后就自己手写一个大数除法

后来看别人博客发现其实不用STL也可以 检查余数是否出现过可以是常数级的 因为除数不大于3000 所以开一个3010的数组来存余数标记即可

当然我还是用的map 因为复杂度实在太松了

这题烦得很

注意“输出前50位”是指所有数字加起来50位... 不是小数点后50位...(哭晕在厕所

然后处理余数的时候大于1的部分一次就搞定了

我真是太年轻以为还有好多种可能... 还搞了一个bitnum来统计小数点前有几次除法过程...

然后再注意出来以后 100/6应该输出16.(6) 1000/6应该输出166.(6) 0/1应该输出0.(0)

还有 写模拟题真的是要头脑清醒再去写

这道题从昨天早上写到昨天晚上

像这种题还有之前那道象棋 虽然什么算法都没考 但是很考验思维的缜密

写之前一定一定要有一个大概的代码架构于心

写了哪里要全部心理有数 要记得 不能写了这里等一下就忘了这里在干什么

出了问题在改的时候一定要确保无论何时都能undo到之前的任何一个状态

总之就是 精神状态要好 精神要高度集中 然后一气呵成

凌乱的代码如下 给一个错误的示范TAT

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <vector>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;

ll a[10000];

int main()
{
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);

    int n, m;
    while(scanf("%d%d", &n, &m) == 2)
    {
        map<int, int> check;
        int q, r;
        int bitnum;
        int stepcnt = 0;
        int lp, rp;

        if(n < m)
            bitnum = 0;
        else
            bitnum = 1;

        q = n / m;
        r = n % m;

        printf("%d/%d = ", n, m);

        int pt = 0;
        while(true)
        {
            a[pt++] = n / m;
            r = n%m;
            if(check.count(r))
            {
                lp = check[r]+1;
                rp = stepcnt;
                break;
            }
            else
            {
                check[r] = stepcnt;
            }

            n = r*10;
            stepcnt++;
        }

        for(int i = 0; i < pt; i++)
        {
            if(i == bitnum)
            {
                if(i == 0)
                {
                    printf("%d", a[i]);
                    printf(".");
                    continue;

                }

                else
                    printf(".");
            }

            if(i == lp)
                printf("(");

            printf("%d", a[i]);

            if(i == rp)
            {
                printf(")\n");
                break;
            }

            if(i >= 50)
            {
                printf("...)\n");
                break;
            }

        }

        printf("   %d = number of digits in repeating cycle\n", rp - lp + 1);
        printf("\n");

    }

    return 0;
}
时间: 2024-10-10 10:40:18

uva 202 Repeating Decimals 模拟的相关文章

UVa 202 Repeating Decimals【模拟】

题意:输入整数a和b,输出a/b的循环小数以及循环节的长度 学习的这一篇 http://blog.csdn.net/mobius_strip/article/details/39870555 因为n%m的余数只可能是0到m-1中的一个,根据抽屉原理,当计算m+1次时至少存在一个余数相同 发现看了题解理解起来也好困难啊, 后来手动画了一下5/7的竖式除法的式子,,理解一些了 1 #include<iostream> 2 #include<cstdio> 3 #include<c

UVa 202 Repeating Decimals

计算循环小数的循环节 输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节长度. 例如,a=5,b=43,小数表示为0.(116279069767441860465),循环字节长度为21 可以用数组储存数字,模拟竖式除法来解决. 附AC代码: 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 const int MAX=3050;

UVa 202 Repeating Decimals 题解

The decimal expansion of the fraction 1/33 is 0.03, where the 03 is used to indicate that the cycle 03 repeats inde?nitely with no intervening digits. In fact, the decimal expansion of every rational number (fraction) has a repeating cycle as opposed

202 - Repeating Decimals

#include <stdio.h> #include <string.h> using namespace std; int isExist(int* list, int size, int val); int main(){ int m, n, divided[5000], count, idx, flag; char decimal[5000]; while(scanf("%d%d", &m, &n) != EOF){ count = 0,

UVA202 UVALive5141 Repeating Decimals

问题链接:UVA202 UVALive5141 Repeating Decimals.基础训练级的问题,用C语言编写程序. 问题简述:输入两个整数numerator和denominator,分别为分子和分母.0≤分子,1≤分母≤3000.输出a/b的循环小数表示以及循环节长度.如果循环周期大于50,只显示50位,之后的全部用"..."表示. 解题思路:先取出整数部分(numerator/denominator的商),然后用余数(numerator%denominator的余数)计算小数

Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 )

Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 ) 题意: 一个书架,原来所有的书都是按顺序摆好的,书的编号从1开始到n 操作: 取出一本书,统计在这本书之前有多少本书,统计完之后,将这本书放在书架的第一位. 如:  1 2 3 4 5取4   4 1 2 3 5 (取之前,有3本书在4前面,取完后,将4放在栈顶)取4   4 1 2 3 5 (取之前,有0本书在4前面,取完后,将4放在栈顶)取2   2 4 1 3 5 (取之前,有2本书在2前面,取完

uva 1156 - Pixel Shuffle(模拟+置换)

题目链接:uva 1156 - Pixel Shuffle 题目大意:给定一个N*N的黑白位图,有7种操作,并且对应在指令后加上'-'即为操作的逆,给定N和一系列操作,(从最后一个开始执行),问说这一套指令需要执行多少次才能形成循环. 解题思路:模拟指令执行后获得一个置换,分解成若干的循环,各个循环长度的最小公倍数即使答案. #include <cstdio> #include <cstring> #include <algorithm> using namespace

UVA202循环小数Repeating Decimals

Repeating Decimals The decimal expansion of the fraction 1/33 is , where the is used to indicate that the cycle 03 repeats indefinitely with no intervening digits. In fact, the decimal expansion of every rational number (fraction) has a repeating cyc

Repeating Decimals UVA - 202

1 The decimal expansion of the fraction 1/33 is 0.03, where the 03 is used to indicate that the cycle 03 2 repeats indefinitely with no intervening digits. In fact, the decimal expansion of every rational number 3 (fraction) has a repeating cycle as