1002 多項式A+B【PAT(上級)演習】
元の質問のリンク:質問の詳細のプレビュー - 多項式の 1002 A+B (pintia.cn)
1.タイトル原文
今回は、 A + B A+B を見つけることになっています。あ+B ここで A A A および B B B は 2 つの多項式です。
入力仕様:
各入力ファイルには 1 つのテスト ケースが含まれています。各ケースは 2 行を占め、各行には多項式の情報が含まれます。
K KK N 1 N_1 N1 a N 1 a_{N_1}あるN1 N 2 N_2N2 a N 2 a_{N_2}あるN2 … N K N_K NK N K a_{N_K}あるNK
ここで K K K は、多項式内のゼロ以外の項の数です。 N i N_i Ni および a N i a_{N_i} あるNi ( i = 1 , 2 , ⋯ , K i=1, 2, \cdots , K 私=1、2、⋯、K) は、それぞれ指数と係数です。 1 ≤ K ≤ 10 1 \le K \le 10 1≤K≤10、 0 ≤ N K <; ⋯ <; N 2 < N 1 ≤ 1000 0 \le N_K <; \cdots <; N_2 <; N_1 \le 1000 0≤NK <;⋯<;N2 <;N1 ≤1000.
出力仕様:
各テスト ケースについて、 A A の合計を出力する必要があります。A および B B B を入力と同じ形式で 1 行に入力します。各行の末尾には余分なスペースがあってはいけないことに注意してください。小数点第 1 位まで正確に入力してください。
サンプル入力:
2 1 2.4 0 3.2
2 2 1.5 1 0.5
サンプル出力:
3 2 1.5 1 2.9 0 3.2
2. タイトル翻訳
这次,你应该找到 A + B A+B あ+B,其中 A A A和 B B B は 2 つの多項式です。
入力仕様:
各入力ファイルにはテスト ケースが含まれています。各ケースは 2 行を占め、各行には多項式情報が含まれます。
K KK N 1 N_1 N1 a N 1 a_{N_1}あるN1 N 2 N_2N2 a N 2 a_{N_2}あるN2 … N K N_K NK N K a_{N_K}あるNK
其中 K K K は多項式内のゼロ以外の項の数です。 N i N_i Ni 和 a N i a_{N_i} あるNi ( i = 1 , 2 , ⋯ , K i=1, 2, \cdots , K 私=1、2、⋯、K)分别是指数和系数。已知 1 ≤ K ≤ 10 1 \le K \le 10 1≤K≤10、 0 ≤ N K <; ⋯ <; N 2 < N 1 ≤ 1000 0 \le N_K <; \cdots <; N_2 <; N_1 \le 1000 0≤NK <;⋯<;N2 <;N1 ≤1000。
出力仕様:
テスト ケースごとに 1 行で出力する必要があります A A A和 B B B の合計は入力と同じ形式になります。各行の末尾に余分なスペースを含めることはできないことに注意してください。小数点第 1 位まで正確に入力してください。
入力例:
2 1 2.4 0 3.2
2 2 1.5 1 0.5
出力例:
3 2 1.5 1 2.9 0 3.2
3. 問題解決のアイデア
3.1 質問分析
2 つの多項式の和を計算するには、2 つの多項式の項数を 2 行に入力し、各項の指数と係数を指数の大きい順に入力すると、多項式の和が同じ形式で出力されます。
3.2 基本的な考え方
多項式加算を実装するアルゴリズム 多項式は通常、配列実装とリンク リスト実装の 2 つの方法で実装されます。
リンク リストの実装: 多項式の各項目はリンク リストのノードであり、ノードは係数と指数を記録します。
配列の実装: 配列の各要素は多項式の係数を表し、配列の添字は多項式の指数を表します。インデックス N ≤ 1000 N \leq 1000 であるためです。N≤1000 ,所以数组大小为 1001
。
3.3 詳細な手順
リンクリストの実装
- ノード構造と多項式タイプを定義します。
- 構造体を使用
Node
して、係数Coefficient
、指数Exponent
、関数へのポインタなど、多項式の各項を表します。 next 項目Next
へのポインタ。 - Definition
Polynomial
は、多項式全体を表すNode
構造体へのポインタです。 Attach
関数を使用
- 構造体を使用
- 比較関数:
- は、
COMPARE
関数を定義します。この関数は 2 つのインデックスのサイズを比較するために使用され、それぞれ小さい、等しい、または大きいことを示す -1、0、または 1 を返します。
- は、
- 多項式を読み取ります。
ReadIn
関数を使用k
を読み取り、次に各項の指数n
と係数a
を読み取ります。ループを通じて、Attach
関数を呼び出して、多項式の末尾に各項を追加します。多項式の先頭ポインタを返します。
- 多項式を出力します。
PrintOut
多項式を出力するには、 関数を使用
- 多項式を追加します。
Add
多項式を追加するには、 関数を 使用- 指数が等しい場合は係数が加算され、結果がゼロでない場合は
Attach
関数が呼び出され、結果の多項式の末尾に追加されます。 - 指数が等しくない場合は、大きい方の指数に対応するノードが、結果として得られる多項式の末尾に追加されます。
- 多項式のノードをトラバースすると、他の多項式の残りのノードが、結果として得られる多項式の末尾に追加されます。
- 指数が等しい場合は係数が加算され、結果がゼロでない場合は
- 結果多項式の先頭ポインタを返します。
- メイン機能:
- 2 つの多項式を読み取り、
Add
関数を呼び出してそれらを加算します。 - 追加された多項式を出力します。
- 2 つの多項式を読み取り、
配列の実装
- 最初の多項式を読み取ります。
- を介して、最初の多項式の非ゼロ項の数を読み取ります。
scanf
K1
- 最初の多項式の係数を保存するための配列を作成します
poly1
。配列の添字は多項式の指数を表し、0
に初期化されます。 - ループを通じて、各項目の指数
N
と係数a
を読み取り、係数をpoly1
に保存します。配列の対応する位置。
- を介して、最初の多項式の非ゼロ項の数を読み取ります。
- 2 番目の多項式を読み取ります。
- を通じて 2 番目の多項式の非ゼロ項の数を読み取ります。
scanf
K2
- 2 番目の多項式の係数を保存するための配列を作成します
poly2
。配列の添字は多項式の指数を表し、0 に初期化されます。 - ループを通じて、各項目の指数
N
と係数a
を読み取り、係数をpoly2
に保存します。配列の対応する位置。
- を通じて 2 番目の多項式の非ゼロ項の数を読み取ります。
- 計算結果:
- 追加された多項式の係数を保存するための配列を作成します
poly
。配列の添字は多項式の指数を表し、0 に初期化されます。 - ループを使用して 2 つの多項式の係数配列を調べ、対応する指数の係数の合計を上位から下位の順に計算し、結果を
poly
配列。
- 追加された多項式の係数を保存するための配列を作成します
- 出力結果:
- 変数を使用
cnt
して、追加された多項式内のゼロ以外の項の数を記録します。 - ループを使用して
poly
配列を走査し、追加された多項式の非ゼロ項の数と各項の指数と係数を出力します。出力形式には小数点以下 1 桁が必要です。
- 変数を使用
4.参考回答
リンクリストの実装
#include <stdio.h>
#include <malloc.h>
// 定义节点结构体
typedef struct Node *PtrToNode;
typedef struct Node {
double Coefficient; // 系数
int Exponent; // 指数
PtrToNode Next; // 指向下一个节点的指针
} PNode;
// 定义多项式类型
typedef PtrToNode Polynomial;
// 比较函数,用于比较两个指数的大小
int COMPARE(int a, int b) {
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
// 将节点(包含系数和指数)附加到多项式的尾部
void Attach(double coefficient, int exponent, PtrToNode *ptr) {
PtrToNode temp;
// 分配新节点
temp = malloc(sizeof(PNode));
temp->Coefficient = coefficient;
temp->Exponent = exponent;
temp->Next = NULL;
(*ptr)->Next = temp; // 将新节点连接到尾部
*ptr = temp; // 更新尾部指针为新节点
}
// 从输入中读取多项式
Polynomial ReadIn() {
PtrToNode front, tail;
double a;
int k, n;
scanf("%d", &k);
if (!k)
return NULL; // 如果多项式的非零项数为0,则返回空指针
tail = malloc(sizeof(PNode));
front = tail;
front->Exponent = -1;
while (k--) {
scanf("%d %lf", &n, &a);
Attach(a, n, &tail);
}
return front; // 返回多项式的头指针
}
// 打印多项式
void PrintOut(Polynomial P) {
Polynomial s;
int k = 0;
s = P->Next;
while (s) {
k++;
s = s->Next;
}
printf("%d", k);
if (k) {
for (s = P->Next; s; s = s->Next)
printf(" %d %.1f", s->Exponent, s->Coefficient);
}
printf("\n");
}
// 多项式相加
Polynomial Add(Polynomial a, Polynomial b) {
PtrToNode front, tail;
double sum;
// 创建结果多项式的头节点
tail = malloc(sizeof(PNode));
front = tail;
front->Exponent = -1;
// 跳过头节点,从第一个节点开始相加
a = a->Next;
b = b->Next;
while (a && b)
switch (COMPARE(a->Exponent, b->Exponent)) {
case -1:
Attach(b->Coefficient, b->Exponent, &tail);
b = b->Next;
break;
case 0:
sum = a->Coefficient + b->Coefficient;
if (sum)
Attach(sum, a->Exponent, &tail);
a = a->Next;
b = b->Next;
break;
case 1:
Attach(a->Coefficient, a->Exponent, &tail);
a = a->Next;
break;
}
// 将剩余的节点附加到结果多项式的尾部
for (; a; a = a->Next)
Attach(a->Coefficient, a->Exponent, &tail);
for (; b; b = b->Next)
Attach(b->Coefficient, b->Exponent, &tail);
tail->Next = NULL; // 结果多项式的尾部指针置空
return front; // 返回结果多项式的头指针
}
// 主函数
int main() {
Polynomial A, B, S;
// 读取两个多项式
A = ReadIn();
B = ReadIn();
// 将两个多项式相加
S = Add(A, B);
// 打印结果多项式
PrintOut(S);
return 0;
}
配列の実装
#include <stdio.h>
#define MAXN 1001
int main() {
int K1, K2, N, i;
double a;
// 读取第一个多项式
scanf("%d", &K1);
double poly1[MAXN] = {
0}; // 多项式1的系数数组,下标表示指数
for (i = 0; i < K1; ++i) {
scanf("%d %lf", &N, &a);
poly1[N] = a;
}
// 读取第二个多项式
scanf("%d", &K2);
double poly2[MAXN] = {
0}; // 多项式2的系数数组,下标表示指数
for (i = 0; i < K2; ++i) {
scanf("%d %lf", &N, &a);
poly2[N] = a;
}
//计算结果
double poly[MAXN] = {
0};
int cnt= 0;
for (i = 1000; i >= 0; --i) {
if (poly1[i] + poly2[i] != 0.0){
cnt++;
poly[i] = poly1[i] + poly2[i];
}
}
// 输出
printf("%d",cnt);
for (i = 1000; i >= 0; --i) {
if (poly[i] != 0.0)
printf(" %d %.1lf", i, poly1[i] + poly2[i]);
}
return 0;
}