PTA-L2-018 Polynom A nach B (25 Punkte)

PTA-L2-018 Polynom A nach B (25 Punkte)

Portal

Dieses Problem, Polynomdivision.
Lassen Sie mich mit dem Operationsprozess beginnen, den ich nicht über Multinomialdivision kenne.
Tatsächlich muss der höchste Posten der Dividende jedes Mal gerundet werden, und zwar so lange, bis der höchste Posten des Divisors größer ist als der höchste Posten der Dividende nach der Operation.

Wir verwenden a[], um den Dividenden zu speichern,
b[], um den Divisor zu speichern.
Betrachten Sie zwei Fälle:
1. Wenn der höchste Termindex von Polynom a kleiner als der höchste Termindex von b ist, dann ist der Quotient 0 und der Rest a 2.
Wenn der höchste Termindex von Polynom a größer oder gleich ist zum höchsten Termindex von b, dann kann es verarbeitet werden. Der höchste Exponent jedes Quotienten ist der höchste Exponent von Polynom a - der höchste Exponent von Polynom b in der aktuellen Operation. Entsprechend kann sein Koeffizient erhalten werden, und dann der Koeffizient kann zum Polynom unseres Quotienten c[] addiert werden.
Verwenden Sie dann diesen aktuellen Quotienten (Exponent + Koeffiziententeil), um das Polynom b[] zu multiplizieren, subtrahieren Sie dieses Produkt vom aktuellen Polynom a[] und aktualisieren Sie das Polynom a[], das eigentlich jedes Mal unser Restpolynom ist der höchste Itemindex von a ist kleiner als der höchste Itemindex von b.
Der letzte Teil ist der Ausgabeteil,
der Quotient wird in c[]
und der Rest in a[] gespeichert.
Zählen wir die Anzahl der auszugebenden Nicht-Null-Elemente Beachten Sie hier, dass wir eine Dezimalstelle für die Ausgabe reservieren, dann ist der kritische Wert 0,05, und diejenigen, die größer oder gleich 0,05 sind, können ausgegeben werden, und diejenigen, die das sind kleiner als 0,05 sind, werden auf 0 gerundet und nicht ausgegeben.
Achten Sie auf den leeren Teil.

Codeteil:

#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
using namespace std;
const int N = 1e5 + 10;
const int M = 55;
const int INF = 1e6 + 10;
const double eps = 0.05;
typedef long long ll;

double a[N], b[N];
double c[N];
int n, m;
int max1, max2;
double k1, k2;

int main()
{
    
    
	int i;
	int x, y;
	cin >> n;
	for (i = 1; i <= n; i++)
	{
    
    
		scanf ("%d%d", &x, &y);
		a[x] = y;
		if (x > max1)
		{
    
    
			max1 = x;
		}
	}
	cin >> m;
	for (i = 1; i <= m; i++)
	{
    
    
		scanf ("%d%d", &x, &y);
		b[x] = y;
		if (x > max2)
		{
    
    
			max2 = x;
		}
	}
	if (max2 > max1)
	{
    
    
		cout << "0 0 0.0\n";
		cout << n;
		for (i = max1; i >= 0; i--)
		{
    
    
			if (fabs(a[i]) >= eps)
			{
    
    
				printf (" %d %.1f", i, a[i]);
			}
		}
		cout << endl; 
	}
	else
	{
    
    
		int t = max1;
		while (max1 >= max2)
		{
    
    
			double tt = a[max1] / b[max2];
			c[max1 - max2] += tt;
			for (i = max2; i >= 0; i--)
			{
    
    
				if (fabs(b[i]) >= eps)
				{
    
    
					a[i + max1 - max2] -= tt * b[i];
				}
			}
			int maxx = 0;
			for (i = t; i >= 0; i--)
			{
    
    
				if (fabs(a[i]) >= eps)
				{
    
    
					if (i > maxx)
					{
    
    
						maxx = i;
						break;
					}
				}
			}
			if (i < 0)
			{
    
    
				break;
			}
			max1 = maxx;
		}
		int cnt1 = 0;
		int cnt2 = 0;
		for (i = t; i >= 0; i--)
		{
    
    
			if (fabs(c[i]) >= eps)
			{
    
    
				cnt1++;
			}
			if (fabs(a[i]) >= eps)
			{
    
    
				cnt2++;
			}
		}
		if (!cnt1)
		{
    
    
			cout << "0 0 0.0\n";
		}
		else
		{
    
    
			int flag = 0;
			cout << cnt1 << " ";
			for (i = t; i >= 0; i--)
			{
    
    
				if (fabs(c[i]) >= eps)
				{
    
    
					if (flag)
					{
    
    
						cout << " ";
					}
					flag = 1;
					printf ("%d %.1f", i, c[i]);
				}
			}
			cout << endl;
		}
		if (!cnt2)
		{
    
    
			cout << "0 0 0.0\n";
		}
		else
		{
    
    
			int flag = 0;
			cout << cnt2 << " ";
			for (i = t; i >= 0; i--)
			{
    
    
				if (fabs(a[i]) >= eps)
				{
    
    
					if (flag)
					{
    
    
						cout << " ";
					}
					flag = 1;
					printf ("%d %.1f", i, a[i]);
				}
			}
			cout << endl;
		}
	}
	return 0;
} 

Supongo que te gusta

Origin blog.csdn.net/qq_44624316/article/details/110232680
Recomendado
Clasificación