luogu2818 天使的起誓
时空限制 1000ms/125M
题目描述
Tenshi非常幸运地被选为掌管智慧之匙的天使。在正式任职之前,她必须和其他新当选的天使一样要宣誓。
宣誓仪式是每位天使各自表述自己的使命,他们的发言稿放在n个呈圆形排列的宝盒中。这些宝盒按顺时针方向被编上号码1,2,…,n-1,n。
一开始天使们站在编号为n的宝盒旁。她们各自手上都有一个数字,代表她们自己的发言稿所在的盒子是从1号盒子开始按顺时针方向的第几个。例如:有7个盒子,如果Tenshi手上的数字为9,那么她的发言稿所在的盒子就是2个。现在天使们开始按照自己手上的数字来找发言稿,先找到的就可以先发言。 Tenshi一下子就找打了,于是她最先上台宣誓:“我将带领大家开启Noi之门……” Tenshi宣誓结束后,陆续有天使上台宣誓。可是有一位天使找了好久都找不到她的发言稿,原来她手上的数字m非常大,她转了好久都找不到她想找的宝盒。
请帮助这位天使找到她想找的宝盒编号。
输入
第一行为正整数n,第二行为正整数m,其中n,m满足2<=n<=10^8,2<=m<=10^1000
输出
只有一行(包括换行符),即天使想找的宝盒的编号。
输入样例1
7 9
输出样例1
2
输入样例2
11 108
输出样例2
9
分析
本题是求高精度/低精度 后的余数,注意,如果余数为零,编号就是n。
代码
法一:数组模拟
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const int N = 1005;
int n,a[N];
void zhuan(string s,int a[]){
memset(a,0,sizeof(int)*N);
a[0] = s.size();
for (int i=1; i<=a[0]; i++) a[i]=s[a[0]-i]-48;
}
void div(int a[],int n){
int r=0;
for (int i=a[0]; i>=1; i--) r=(10*r+a[i])%n;
if (r==0) cout<<n<<'\n';
else cout<<r<<'\n';
}
int main(){
string s;
while (cin>>n>>s){
zhuan(s,a);
div(a,n);
}
return 0;
}
法二:重载运算符
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int N = 1005;
struct bign{
int len,d[N];
bign(){ memset(d,0,sizeof(d)); len=1; } //构造函数,默认初始化
bign(string x){ //构造函数,string初始化
memset(d,0,sizeof(d));
len = x.size();
for (int i=1; i<=len; ++i) d[i]=x[len-i]-48;
}
int operator % (const int &b){ //重载% 高%低
int r=0;
for (int i=len; i>=1; --i) r=(10*r+d[i])%b;
return r;
}
friend istream& operator >> (istream& input,bign &x){ //重载输入流
string s;
input>>s;
x = s;
return input;
}
friend ostream& operator << (ostream& output,const bign &x){//重载输出流
for (int i=x.len; i>=1; --i) cout<<x.d[i];
return output;
}
};
int main(){
int n,r; bign m;
while (cin>>n>>m){ //需重载输入流
r = m%n; //需重载%
if (r==0) cout<<n<<'\n'; //需重载输出流
else cout<<r<<'\n';
}
return 0;
}