2016-04-02 10 views
0

リンクリストで表される2つの数字を追加しようとしています。だから私は3 - > 2-> 8と6-> 5-> 4という数字を挿入した。私は数字328と654を取得しようとし、2つを追加し、3番目のリストに挿入します。私は数を計算中にいくつかの問題に直面しています。ここにコードがあります。リンクリストを使用して2つの数字を追加する

#include<bits/stdc++.h> 

using namespace std; 


struct Node{ 
int data; 
struct Node *next; 
}; 
int flag=1; 
void input(Node **head,int num) 
{ 
    Node *temp=(struct Node*)malloc(sizeof(struct Node)); 
    temp->data=num; 
    if(!flag)temp->next=*head; 
    if(flag){temp->next=NULL;flag=0;} 
    *head=temp; 
} 

void add(Node *l1,Node *l2,Node *l3) 
{ 
    Node *cur1=l1; 
    Node *cur2=l2; 
    int size1=0,size2=0; 

    while(cur1!=NULL) 
    { 
     size1++; 

     cur1=cur1->next; 
    } 
    while(cur2!=NULL) 
    { 
     size2++; 
     cur2=cur2->next; 
    } 
    int i=size1-1,j=size2-1,sum1=0,sum2=0; 
    cur1=l1;cur2=l2; 
    cout<<i<<endl; 
    while(cur1!=NULL) 
    { 
     cout<<cur1->data<<"\t"; 
     cout<<cur1->data*pow(10,i)<<"\t"; 

     sum1=sum1+cur1->data*pow(10,i); 
     cout<<sum1<<endl; 
     i--; 
     cur1=cur1->next; 
    } 
    cout<<sum1<<endl; 
    while(cur2!=NULL) 
    { cout<<cur2->data<<"\t"; 
     cout<<cur2->data*pow(10,j)<<"\t"; 
     sum2=sum2+cur2->data*pow(10,j); 
     cout<<sum2<<endl; 
     j--; 
     cur2=cur2->next; 
    } 
    cout<<sum2<<endl; 
    sum1+=sum2; 
    while(sum1!=0) 
    { 
     int r=sum1%10; 
     input(&l3,r); 
     sum1/=10; 
    } 
    cur1=l3; 
    while(cur1!=NULL) 
    { 
     cout<<cur1->data; 
     cur1=cur1->next; 
    } 
} 

int main() 
{ 
    Node *l1=NULL; 
    Node *l2=NULL; 
    Node *l3=NULL; 
    input(&l1,8); 
    input(&l1,2); 
    input(&l1,3); 
    flag=1; 
    input(&l2,4); 
    input(&l2,5); 
    input(&l2,6); 
    add(l1,l2,l3); 
    return 0; 
} 

私はこの問題は、切り捨てが原因である可能性があり、出力

2 //value of i 
3  300  299 //cur1->data*pow(10,i) is initially 300 then becomes 299 
2  20  319 
8  8  327 
327 //total sum which should be 328 
6  600  599 //Same problem 
5  50  649 
4  4  653 
653 //total sum which should be 654 
980 //sum of 327 and 653 
+0

これはCかC++ですか? C++のように見えます。もしそうなら、それに応じてタグを編集してください。 – tonysdg

+0

この例では、2つの数字の桁数が同じであることがわかりますが、一般的にはそうではありません。また、この例では、結果は入力と同じ桁数を持ちますが、出力は入力より1桁多くなります(たとえば、499と501を追加することを考慮してください)。あなたはキャリーを扱うためにバックトラックすることができなければなりません(499 + 501の場合、2回バックトラックし、結果の始めに新しい要素を追加する必要があります; 328 + 654では、 –

+0

tonysdgに:申し訳ありません私は構造とCの考えを使用していました:そして、ジョナサンに:いいえ、私はリンクされている桁数が分かりません。あなたは気付いていないことはありません。これは私が変数size1とsize2のそれぞれのサイズを計算する理由です。そして、はい、私はそれをチェックアウトしました。異なるサイズのリストでも動作します。 –

答えて

2

を取得します。 pow関数は浮動小数点を返します。次に、切り捨てを起こす整数に変換します。

例:

299.99999999 as float will become 299 as int 

代わりに丸め得るために0.5最初のを追加してください。

等:@viraptorによってコメントとして

sum1=sum1+(cur1->data*pow(10,i) + 0.5); 

フロート(すなわちPOW)を避けるためにも優れています。

sum1 = 0; 
while(cur1 != NULL) 
{ 
    sum1 = 10 * sum1; 
    sum1 = sum1 + cur1->data; 
    cur1=cur1->next; 
} 

すべての計算は整数で行われ、floatとintの間の変換によって問題は発生しません。

+1

さらに良い点 - 浮動小数点を完全に取り除くこと。 'sum1 * = 10; sum1 + = cur1; 'いいえ' pow'、丸めなし、 'i'を数える必要はありません。 – viraptor

+0

@viraptor - 私は同意します。私はちょうど何が起こっていたのか説明しようとした。しかし、可能であれば浮動小数点は避けるべきです - ここで可能です。 – 4386427

+0

ありがとうございます。それは0.5で働いた。そして、私はそれらを避けることを覚えています。今日は新しいことを学んだ:) –

関連する問題