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


1357: 小E与计算器

时间限制: 1 Sec  内存限制: 128 MB
提交: 145  解决: 19

题目描述

小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)
1
Case 2:
2/1=2.(0)
1
Case 3:
1/97=0.(01030927835051546391752577319587628865979381443298...)
96

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


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



题解:

解决这一题,我们稍微一分析,就能够简化问题。因为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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值