深入浅出学算法022-天使的起誓

文章描述了一个问题情境,天使们寻找各自发言稿的宝盒,通过高精度取余算法来确定宝盒的编号。Tenshi成功找到并宣誓,但另一位天使因数字过大而困难。提供的解决方案是使用字符串表示大数,转换为数组进行取余计算,注意余数为0时应返回n而非0。
摘要由CSDN通过智能技术生成

Tenshi非常幸运地被选为掌管智慧之匙的天使。在正式任职之前,她必须和其他新当选的天使一样要宣誓。

宣誓仪式是每位天使各自表述自己的使命,他们的发言稿放在n个呈圆形排列的宝盒中。这些宝盒按顺时针方向被编上号码1,2,…,n-1,n。

一开始天使们站在编号为n的宝盒旁。她们各自手上都有一个数字,代表她们自己的发言稿所在的盒子是从1号盒子开始按顺时针方向的第几个。例如:有7个盒子,如果Tenshi手上的数字为9,那么她的发言稿所在的盒子就是2个。现在天使们开始按照自己手上的数字来找发言稿,先找到的就可以先发言。

Tenshi一下子就找到了,于是她最先上台宣誓:“我将带领大家开启Noi之门……” Tenshi宣誓结束后,陆续有天使上台宣誓。可是有一位天使找了好久都找不到她的发言稿,原来她手上的数字m非常大,她转了好久都找不到她想找的宝盒。

请帮助这位天使找到她想找的宝盒编号。

输入

第一行为正整数n,第二行为正整数m,其中n,m满足2<=n<=108,2<=m<=101000

输出

只有一行(包括换行符),即天使想找的宝盒的编号。

样例输入
【输入样例1】
7
9
【输入样例2】
11
108
样例输出
【输出样例1】
2
【输出样例2】
9

其实不难发现,本题是一个高精度取余的问题,那么可以使用string存储输入数,然后转成 int[]数组 a[]

取余其实就是除法,是从高到低运算,所以不需要像高精度求积一样反转字符串,直接for循环转成a[]即可

转成数组之后,可以逐位取余;不过需要注意,如果最后的余数为0,按照本题要求不能输出0,应该输出n才对

a[i]=a[i-1]*10+a[i];
a[i]=a[i]%n;

完整代码

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<string>

using namespace std;

//高精度取余
//n<=10^8,所以返回值直接用int即可 
long big_mod(string s1,long n){
	int* a=new int [s1.length()];
//	字符转数组 
	for(int i=0;i<s1.length();i++){
		a[i]=s1[i]-'0';
	}
	long temp=a[0];
	for(int i=1;i<s1.length();i++){
		temp=temp*10+a[i];
		temp=temp%n;
	}
	//如果余数是0,说明位置是n
	//防止长度同为1的情况 
	temp=temp%n; 
	if(temp==0) return n;
	else return temp;
} 

int main(){
	long n;
	string str;
	cin>>n;
	cin>>str;
	cout<<big_mod(str,n)<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值