2011(C++)

https://acs.jxnu.edu.cn/problem/NOIOPJCH02042991

2011

描述:

已知长度最大为200位的正整数n,请求出2011^n的后四位。

输入:

第一行为一个正整数k,代表有k组数据,k<=200接下来的k行,

每行都有一个正整数n,n的位数<=200

输出:

每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0

样例输入:

3
5
28
792

复制

样例输出:

1051
81
5521

 关于本题,一开始就要注意这是个求指数的问题,而且指数的位数范围在200位,可见没有这么大的数据类型用于存放指数,所以我们将指数当作字符存放到字符数组当中。

一个规律:2011的n次方的后四位数的规律:每500个数循环一次,就是说2011^{1}2011^{501}的后四位相同。所以我们只需要将该指数取500的模的结果当作新的指数参与计算就能得到相同的后四位数了。

因为我们需要将该指数 mod 500,可想而知,先前存在字符数组里的数并不是全部都需要的,如果输入的指数超过3位,我们只需要取后三位(转换成整数)mod 500 即可,这样就可以巧妙地避免因高位数无法存储而无法取模计算的问题了。

#include<bits/stdc++.h>//万能头文件
using namespace std;
char a[210];
int main()
{
    int k,i;
    cin>>k;
    while(k--)
    {
        int m=1;//m和x都要放在循环内每次更新
        int x=0;
        cin>>a;//题给200位太大,存储在字符数组中
        int len=strlen(a);
        if(len>3)
        {
            for(i=len-3;i<len;++i)从前往后数的后3位
                x=x*10+a[i]-'0';//通过减‘0’将字符转换成数值
        }
        else 
        {
            for(i=0;i<len;++i)
                x=x*10+a[i]-'0';
        }
        x=x%500;
        for(i=0;i<x;++i)
        {
            m=m*2011%10000;每次都只取后四位,否则数值太大会溢出
        }
        cout<<m<<endl;
    }
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值