2011
Posted malcolmmeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2011相关的知识,希望对你有一定的参考价值。
- 题目链接http://noi.openjudge.cn/ch0204/2991/
- 描述
- 已知长度最大为200位的正整数n,请求出2011^n的后四位。
- 输入
- 第一行为一个正整数k,代表有k组数据,k<=200接下来的k行,
每行都有一个正整数n,n的位数<=200 - 输出
- 每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0
- 样例输入
-
3 5 28 792
- 样例输出
-
1051 81 5521
查看
这题用分治来做,另外练习操作符重载
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<string> #include<vector> #include<ios> #define DEBUG(x) cout<<#x<<" = "<<x<<endl using namespace std; const int MAXN=220; struct BigInt{ char digits[MAXN]; int len; BigInt(){ memset(digits,0,sizeof(digits)); len=0; }; bool isOdd() { int n=digits[0]-‘0‘; return n%2!=0; } friend istream& operator>>(istream & in,BigInt &n) { in>>n.digits; n.len=strlen(n.digits); reverse(n.digits,n.digits+n.len); return in; } friend ostream& operator<<(ostream &out, const BigInt &n) { out<<n.digits; return out; } BigInt half() { BigInt rt; int carry=0; for(int i=len-1;i>=0 ;i-- ){ int v=digits[i]-‘0‘; rt.digits[i]=(v+carry)/2+‘0‘; carry=(v+carry)%2*10; } int p=len-1; while(rt.digits[p]==‘0‘){ if(p!=0) rt.digits[p]=‘