División analógica detallada

División analógica: Se refiere a la división que excede el int y no se puede resolver con el operador de división, pero no llega al rango de dividir números grandes. Este tipo de división generalmente se almacena en cadenas comerciales. Es decir: el divisor y el cociente se pueden almacenar en long long, y el dividendo se puede almacenar en string.

Es probable que este tipo de problema se dé en forma de multiplicación, y es necesario encontrar un producto que exceda el rango de long long, pero hay una forma de obtener el factor.

En competiciones generales, la división analógica es más utilizada que la división de grandes números.

Algoritmo específico:

Analógico vertical: queremos obtener el cociente más alto y reducir el dividendo, el operador / y % se pueden usar en combinación

//模拟除法的关键
ans += (a / b + ' 0');    //a->被除数   b->除数	
a %= b;

Por favor vea el código para más detalles:

int main()
{
	long long a = 0;  //被除数
	long long b = 0;
	string ans;
	cin >> a >> b;
	int flag = 1;	//判断是否加了小数点
	int count = 10;  //限定位数,不是所有数都能整除
	while (a != 0 && count != 0)
	{
		if (a < b)  //小数点只能加一次
		{
			a *= 10;
			if(flag == 1)
				ans += '.';
			flag--;
		}
		ans += (a / b + ' 0'); 
		count--;
		a %= b;
	}
	cout << ans;
	return 0;
}

Es obvio a simple vista, así que no lo repetiré.

Tema: (El tema es un enlace interno, este artículo solo puede divulgar el contenido del tema)

 Después de entender el código anterior, no es difícil lidiar con este problema

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

int main()
{
	long long n = 0;
	cin >> n;
	string ans;
	long long count = 1;
	long long k = 1;
	int flag = 0;	//0表示还没有补0, 1表示补了0
	while (k != 0)
	{
		if (k >= n) //被除数大于除数,先除了再说
		{
			ans += (k / n + '0');
			k %= n;
			flag = 0;   
		}
		else //除到一半发现被除数没有了,继续扩充被除数
		{
			// 特判:如果已经补了1还是不够除,就要先商一个0
			if(flag == 1)
			{
				ans += '0';
				// 注意这里不能将flag变为0,因为可能补了好多个1都不够除,例如 1 / 123456889
			}
			k = k * 10 + 1;	
			count++;
			flag = 1;
			continue;	// 回去再除
		}
	}
	for (int i = 0; i < ans.size(); i++)
	{
		if (ans[i] != '0')   //去除ans的前导0
		{
			cout << ans[i];
		}
	}
	cout << endl << count;
	return 0;
}

Si no entiendes, puedes comentar o enviarme un mensaje privado ~

Espero compartir contigo

Supongo que te gusta

Origin blog.csdn.net/qq_61567032/article/details/124625057
Recomendado
Clasificación