#142-(EZOI高精度练习)[高精度]天使的宣誓

版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/83310909

Description

TENSHI非常幸运的被选为掌管智慧之匙的天使。在正式任职之前,她必须和其他新当选的天使一样,要宣誓。宣誓仪式是每位天使各自表述自己的使命,她们的发言稿被放在N个呈圆形排列的宝盒中。这些宝盒按顺时针方向被编上号码1、2、3……、N-1、N。一开始天使们站在编号为N的宝盒旁。她们各自手上都有一个数字,代表她们自己的发言稿所在的盒子是从1号盒子开始按顺时针方向的第几个。例如:有7个盒子,那么如果TENSHI手上的数字为9,那么她的发言稿所在盒子就是第2个。现在天使们开始按照自己手上的数字来找发言稿,先找到的就可以先发言。TENSHI一下子就找到了,于是她最先上台宣誓:“我将带领大家开启NOI之门……”TENSHI宣誓结束以后,陆续有天使上台宣誓。可是有一位天使找了好久都找不到她的发言稿,原来她手上的数字M非常大,她转了好久都找不到她想找的宝盒。 
请帮助这位天使找到她想找的宝盒的编号
 

Input

每组测试数据占2行,分别读入正整数N和M,其中N、M满足 2 ≤ N ≤ 108,2 ≤ M ≤ 101000 

Output

输出所求宝盒的编号,占一行

Sample Input

【样例一】:
7 9

【样例二】:
11 108

Sample Output

【样例一】:
2

【样例二】:
9

就是高精度求余

#include <iostream>
#include <cstring>
#include <string>

#define SIZE 1010

using namespace std;

string s;
int a[SIZE], b[SIZE], temp[SIZE], lena, lenb, i;

bool comp(void) // 判断大小
{
	int i;
	
	if (lena < lenb + ::i)
	{
		return false;
	}
	if (lena > lenb + ::i)
	{
		return true;
	}
	for (i = lena; i; --i)
	{
		if (a[i] < temp[i])
		{
			return false;
		}
		if (a[i] > temp[i])
		{
			return true;
		}
	}
	
	return true;
}

void sub(void) // 减法
{
	int i;
	
	for (i = 1; i <= lena; ++i)
	{
		a[i] -= temp[i];
		if (a[i] < 0)
		{
			--a[i+1];
			a[i] += 10;
		}
	}
	while ((!a[lena]) && (lena)) // 更新长度
	{
		--lena;
	}
	
	return;
}

int main(void)
{
	int len, j;
	
	cin >> s;
	lenb = s.size();
	for (i = 1; i <= lenb; ++i)
	{
		b[i] = s[lenb-i] - '0';
	}
	cin >> s;
	
	lena = s.size();
	for (i = 1; i <= lena; ++i)
	{
		a[i] = s[lena-i] - '0';
	}
	len = max(lena - lenb, 0);
	for (i = len; ~i; --i)
	{
		memset(temp, 0, sizeof (temp));
		for (j = 1; j <= lenb; ++j)
		{
			temp[i+j] = b[j];
		}
		while (comp()) // 一直减直到不能减为止
		{
			sub();
		}
	}
	
	for (i = lena; i; --i)
	{
		printf("%d", a[i]);
	}
	if (!lena)
	{
		printf("0");
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/83310909