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个数循环一次,就是说与
的后四位相同。所以我们只需要将该指数取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;
}
&spm=1001.2101.3001.5002&articleId=123359230&d=1&t=3&u=551524f840a547a29c105bb2db5df8be)
3万+

被折叠的 条评论
为什么被折叠?



