luogu2818 天使的起誓(高/低)

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值