チェーンテーブルシミュレーション加算問題
タイトルの説明
2つのチェーンテーブルが与えられ、各チェーンテーブルのノード値が数字の各ビットの数字であり、2つのチェーンテーブルが表す数字の和を求め、結果をチェーンテーブルとして返します.
チェーンテーブルのノード定義は次のとおりです.
問題はちょっと言いにくいですが、例を見てください.
2つのチェーンテーブルがそれぞれlist 1およびlist 2であり、list 1の各ノード値がそれぞれ数字513のビット、10ビットおよび100ビットの数字であり、同じlist 2の各ノード値が数字295の各ビットの数字であると仮定する.この2つの数を808に加算するので、出力は1ビットから100ビットの順に出力され、返される結果チェーンテーブルは以下のようになる.
list1: (3 -> 1 -> 5)
list2: (5 -> 9 -> 2)
result:(8 -> 0 ->8)
ぶんせき
このテーマはおもしろいので、チェーンテーブルの操作に熟練する必要があります.2つの数値加算過程を考慮し,低位から高位まで順次加算し,キャリーがあればキャリーフラグをマークし,最高位まで終了した.現在のビットのノードをcurrentとすると、次のようになります.
この問題を再帰的に解決するには、次のコードを使用します.
2つのチェーンテーブルが与えられ、各チェーンテーブルのノード値が数字の各ビットの数字であり、2つのチェーンテーブルが表す数字の和を求め、結果をチェーンテーブルとして返します.
チェーンテーブルのノード定義は次のとおりです.
typedef struct node *pNode;
struct node
{
int data;
struct node *next;
};
問題はちょっと言いにくいですが、例を見てください.
2つのチェーンテーブルがそれぞれlist 1およびlist 2であり、list 1の各ノード値がそれぞれ数字513のビット、10ビットおよび100ビットの数字であり、同じlist 2の各ノード値が数字295の各ビットの数字であると仮定する.この2つの数を808に加算するので、出力は1ビットから100ビットの順に出力され、返される結果チェーンテーブルは以下のようになる.
list1: (3 -> 1 -> 5)
list2: (5 -> 9 -> 2)
result:(8 -> 0 ->8)
ぶんせき
このテーマはおもしろいので、チェーンテーブルの操作に熟練する必要があります.2つの数値加算過程を考慮し,低位から高位まで順次加算し,キャリーがあればキャリーフラグをマークし,最高位まで終了した.現在のビットのノードをcurrentとすると、次のようになります.
current->data = list1->data + list2->data + carry( , 1, 0)
この問題を再帰的に解決するには、次のコードを使用します.
pNode addLists(pNode list1, pNode list2, int carry) {
if (!list1 && !list2 && !carry)
return NULL;
pNode result = newNode(carry);
int value = carry;
if (list1)
value += list1->data;
if (list2)
value += list2->data;
result->data = value % 10;
pNode more = addLists(list1?list1->next:NULL, list2?list2->next:NULL, value>=10?1:0);
result->next = more;
return result;
}