• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            兩個數相乘,小數點后位數沒有限制,請寫一個高精度算法【轉】

            算法提示:

                      輸入 string a, string b; 計算string c=a*b; 返回 c;

            1,    紀錄小數點在a,b中的位置l1,l2, 則需要小數點后移動位置數為l=length(a)+length(b)-l1-l2-2;

            2,    去掉a,b中的小數點,(a,b小數點后移,使a,b變為整數)

            3,    計算c=a*b; (同整數的大數相乘算法)

            4,    輸出c,(注意在輸出倒數第l個數時,輸出一個小數點。若是輸出的數少于l個,就補0)

            du51(郁郁思揚)的答案:


            變為整數求就行了.輸入的時候記一下,小數點位置..輸出再做點文章就行了.
            下面的是大整數的運算.
            #include<iostream>
            using namespace std;
            #define MAX 10000
            struct Node{
               int data;
               Node *next;
            };
            void output(Node *head)
            {
               if(!head->next&&!head->data)return;
               output(head->next);
               cout<<head->data;
            }
            void Mul(char *a,char *b,int pos)        
            {
               char *ap=a,*bp=b;
               Node *head=0;
               head=new Node;head->data=0,head->next=0;   //頭
               Node *p,*q=head,*p1;
               int temp=0,temp1,bbit;
               while(*bp)                //若乘數不為空 ,繼續.
               {
                   p=q->next;p1=q;
                   bbit=*bp-48;          //把當前位轉為整型
                   while(*ap||temp)            //若被乘數不空,繼續
                   {
                       if(!p)            //若要操作的結點為空,申請之
                       {
                           p=new Node;
                           p->data=0;
                           p->next=0;
                           p1->next=p;
                       }
                       if(*ap==0)temp1=temp;
                       else { temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }
                       p1->data=temp1%10;    //留當前位
                       temp=temp1/10;    //進位以int的形式留下.
                       p1=p;p=p->next;                 //被乘數到下一位
                   }
                   ap=a;bp++;q=q->next;                //q進下一位
               }
               p=head;
               output(p);                   //顯示
               cout<<endl;
               while(head)                 //釋放空間
               {
                       p=head->next;
                       delete head;
                       head=p;
               }
            }
            int main()
            {
               cout<<"請輸入兩個數"<<endl;
               char test1[MAX],test2[MAX];
               cin.getline(test1,MAX,'\n');
               cin.getline(test2,MAX,'\n');
               Mul(strrev(test1),strrev(test2));
               system("PAUSE");
               return 0;
            }
            上面大整數已經寫了.你加幾個東西就行了.
            #include<iostream>
            using namespace std;
            #define MAX 10000
            struct Node{
               int data;
               Node *next;
            };
            void output(Node *head,int pos)
            {
               if(!head->next&&!head->data)return;
               output(head->next,pos-1);
               cout<<head->data;
               if(!pos)cout<<".";
            }
            void Mul(char *a,char *b,int pos)        
            {
               char *ap=a,*bp=b;
               Node *head=0;
               head=new Node;head->data=0,head->next=0;   //頭
               Node *p,*q=head,*p1;
               int temp=0,temp1,bbit;
               while(*bp)                //若乘數不為空 ,繼續.
               {
                   p=q->next;p1=q;
                   bbit=*bp-48;          //把當前位轉為整型
                   while(*ap||temp)            //若被乘數不空,繼續
                   {
                       if(!p)            //若要操作的結點為空,申請之
                       {
                           p=new Node;
                           p->data=0;
                           p->next=0;
                           p1->next=p;
                       }
                       if(*ap==0)temp1=temp;
                       else { temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }
                       p1->data=temp1%10;    //留當前位
                       temp=temp1/10;    //進位以int的形式留下.
                       p1=p;p=p->next;                 //被乘數到下一位
                   }
                   ap=a;bp++;q=q->next;                //q進下一位
               }
               p=head;
               output(p,pos);                   //顯示
               cout<<endl;
               while(head)                 //釋放空間
               {
                       p=head->next;
                       delete head;
                       head=p;
               }
            }
            int main()
            {
               cout<<"請輸入兩個數"<<endl;
               char test1[MAX],test2[MAX],*p;
               int pos=0;
               cin.getline(test1,MAX,'\n');
               cin.getline(test2,MAX,'\n');
               if(p=strchr(test1,'.'))
               {
                   pos+=strlen(test1)-(p-test1)-1;
                   do
                   {
                       p++;
                       *(p-1)=*p;
                   }while(*p);
               }       
               if(p=strchr(test2,'.'))
               {
                   pos+=strlen(test2)-(p-test2)-1;
                   do
                   {
                       p++;
                       *(p-1)=*p;
                   }while(*p);
               }   
               Mul(strrev(test1),strrev(test2),pos);
               system("PAUSE");
               return 0;
            }

             

            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/hanlin1985/archive/2008/10/10/3048605.aspx

            posted on 2011-06-07 10:25 Hsssssss 閱讀(7698) 評論(0)  編輯 收藏 引用 所屬分類: C++代碼

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導航

            統計

            常用鏈接

            留言簿

            文章分類

            文章檔案

            收藏夾

            搜索

            最新評論

            久久久久国产| 久久国产高清字幕中文| 精品国产乱码久久久久软件| 最新久久免费视频| 99久久精品国产免看国产一区| 97久久精品人人澡人人爽| 久久久久99这里有精品10| 国产精品一区二区久久精品| 亚洲人AV永久一区二区三区久久| 久久精品人人做人人爽电影蜜月 | 久久久久青草线蕉综合超碰| 国产精品久久亚洲不卡动漫| 久久久黄色大片| 久久精品人妻一区二区三区| 99久久免费国产精精品| 久久福利资源国产精品999| 久久最近最新中文字幕大全| 日日噜噜夜夜狠狠久久丁香五月 | 99久久国产综合精品女同图片 | 久久久久免费看成人影片| 亚洲精品国产综合久久一线| 国产精品免费久久| 狠狠狠色丁香婷婷综合久久俺| 久久精品国产2020| 久久只有这里有精品4| 欧美大战日韩91综合一区婷婷久久青草 | 国产高潮国产高潮久久久91| 99国产精品久久| 狠狠色丁香久久婷婷综合五月 | 狠狠精品久久久无码中文字幕 | 国产99久久久久久免费看| 天天爽天天爽天天片a久久网| 久久青青草原精品国产| 无码人妻精品一区二区三区久久久| 久久亚洲精品国产精品婷婷| 伊人久久大香线蕉综合热线| 久久无码专区国产精品发布 | 色欲久久久天天天综合网精品| 欧美va久久久噜噜噜久久| 99久久精品国内| 久久高潮一级毛片免费|