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

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



