首页 > 学院 > 开发设计 > 正文

qutoj 1357 小E与计算器(模拟)

2019-11-08 01:34:29
字体:
来源:转载
供稿:网友

题目地址点击打开链接

比赛的时候是懵逼的,怎么求循环体。。。

过了这么久才来补,看了看题解才发现原来这么水。。。

题解:

解决这一题,我们稍微一分析,就能够简化问题。因为n除以m的余数只能是0,m-1,根据抽屉原则,当计算m+1次时,至少存在一个余数相同,即为循环节。故我们只需存储余数输出即可。

注意:一开始做输出超限了,因为把小数位数定了5000,余数最多3000个,但不意味最多3000小数位,3000个数位数会大于5000,所以会出错。

代码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 50005;int rec[maxn*2], val[maxn*2];int main(void){    int a, b, ca = 1;    while(cin >> a >> b)    {        memset(rec, 0, sizeof(rec));        int x = a%b*10, i;        for(i = 1; i < maxn; i++)        {            if(rec[x]) break;            if(!x) break;            rec[x] = i;            val[i] = x/b;            x = x%b*10;        }        PRintf("Case %d:/n%d/%d=", ca++, a, b);        printf("%d.", a/b);        if(!x)        {            for(int j = 1; j < i; j++)                printf("%d", val[j]);            printf("(0)/n1/n");        }        else        {            //输出不循环的            for(int j = 1; j < rec[x]; j++)                printf("%d", val[j]);            //循环体超过50            if(i-rec[x] > 50)            {                printf("(");                for(int j = rec[x]; j <= rec[x]+49; j++)                    printf("%d", val[j]);                printf("...)/n");            }            //不超过50            else            {                printf("(");                for(int j = rec[x]; j < i; j++)                    printf("%d", val[j]);                printf(")/n");            }            printf("%d/n", i-rec[x]);        }    }    return 0;}

1357: 小E与计算器

时间限制: 1 Sec  内存限制: 128 MB提交: 147  解决: 20

题目描述

小E学完C语言之后,想写一个计算器。刚开始行云流水般把+,-,x功能给写完了。但是遇到了除法,小E就。万能的ACMer,你能帮助的小E完成除法功能吗?小E要实现的计算器的除法显示,如表所示:

算式

计算器显示结果

循环小数的循环体

循环体长度

1÷2

0.5(0)

0

1

1÷3

0.(3)

3

1

2÷7

0.(285714)

285714

6

       (当循环体超过50位,那么多余的部分使用...代替)

输入

输入包括若干组测试用例,每组测试用例包括一行:

第一行包括两个整数a, b(a表示被除数,b表示除数)(1 ≤ a, b ≤ 3000)。

(tips:保证a/b的整数部分不会大于等于10)

输出

输出只有三行。

第一行输出测试样例编号

第二行包括a÷b的计算器显示结果

第三行包括循环体的长度

 (具体格式参考样例输出)

样例输入

1 22 11 97

样例输出

Case 1:1/2=0.5(0)1Case 2:2/1=2.(0)1Case 3:1/97=0.(01030927835051546391752577319587628865979381443298...)96


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表