廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 5006 個閱讀者
 
<<   1   2  下頁 >>(共 2 頁)
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
Chiunyao 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
社區建設獎 特殊貢獻獎
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x4 鮮花 x776
分享: 轉寄此文章 Facebook Plurk Twitter 版主評分版主評分 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[C/C++][範例] Big Number(大數相加)
順便幫這位樓主解答一下唄.....





這個程式是大數相加....意思就是說在普通的電腦可能只能做到32767這麼大的數字相加或相減

如果你想要在更多的位數相加要怎麼辦(就是當變數宣告成int long double...etc..都無法解決時)

可以利用STRING(指標)來處理這種問題...因為你的指標可以宣告很大所以你把每一位..宣告成一個

指標,然後用指標相加在配合一些進位的規則..就可以做出大數相加的計算式拉!!!


延伸:我如果沒記錯的話...好像指標的MAX範圍好像道255唷..如果你的位數又要超過255這時候要怎麼半

呢,我提供一下我上課聽到的東西,就是當你超過255那麼大的位數,好比幾萬位 ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容



[ 此文章被Chiunyao在2005-04-09 11:33重新編輯 ]

此文章被評分,最近評分記錄
財富:100 (by panasonic732)
支持度:10 (by panasonic732) | 理由: 有你的..!!那麼利害&熱心 特別給你的獎勵
財富:100 (by 夷希微) | 理由: 嗯嗯~果然厲害~<img src=http://bbs1.mychat.to/images/post/smile/35.gif>



     


人要活在當下....才是最幸福的!!!
獻花 x5 回到頂端 [樓 主] From:台灣中華電信 | Posted:2005-04-02 11:39 |
唐老鴨
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x230
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

延伸:我如果沒記錯的話...好像指標的MAX範圍好像道255唷..如果你的位數又要超過255這時候要怎麼半

呢,我提供一下我上課聽到的東西,就是當你超過255那麼大的位數,好比幾萬位幾萬位相加減或,相乘

那是不是電腦根本沒辦法運算...所以你可以運用255進位的方法來寫..就是把它當作是一個BYTE...

這樣就可以表達很大很大的數目....其實這個方法我也不會寫,只是知道大概的觀念。會的人可以指正

一下唷....


聽大大的解釋....
我想我大概知道怎麼寫了.....
下次有時間的話....
我試著寫寫看....
寫完再放上來囉^^.....


沒東西可以抓
獻花 x0 回到頂端 [1 樓] From:美國 | Posted:2005-04-04 09:59 |
唐老鴨
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x230
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

我來囉....
你只是要做100*100的相乘對吧....
你先想想看第一個問題.....
100位數*100位數的結果最大會有幾位數呢.....
m=100;
n=100;

答案就是m+n位數.....

再想想另一個問題....我們是如何做乘法的.....
舉個例.....
  15
*30
----------
  00
45
--------
450

是用第二個數乘上第一個數.....
那麼0先乘上5會落在第幾個陣列位置呢(假設個位數的陣列位置為a[0])......
答案就是第0個位置.....若是有進位的話.....就是i+1個位置.....
同樣的....3乘上1會落在第幾個位置....答案是第2個.....
也就是說.....當你用兩個FOR迴圈去計算結果的話(假設A為第一個數....B為第二個數.....C為結果)...
那麼C[i+j]=A[ i ]*B[j]+CarryIn.....
這樣講你聽的懂了ㄇ????
真的有問題我在幫你寫寫看^^......


[ 此文章被唐老鴨在2005-04-08 10:44重新編輯 ]

此文章被評分,最近評分記錄
財富:100 (by Chiunyao) | 理由: 謝謝妳的熱心指導....


沒東西可以抓
獻花 x1 回到頂端 [2 樓] From:美國 | Posted:2005-04-08 10:26 |
唐老鴨
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x230
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

再改一下....
有一點點說錯....
應該是C[i+j]+=(A[ i ]*B[j]+CarryIn);
因為要包含重複項..... 表情


沒東西可以抓
獻花 x0 回到頂端 [3 樓] From:美國 | Posted:2005-04-08 19:44 |
唐老鴨
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x230
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

給你程式碼....
因為加CarryIn的寫法我覺得比較麻煩....
要加比較多的式子....
所以我乾脆把CarryIn都省略了....
不過我寫的比較簡略....
但一樣是照上面跟你說的方法寫的.....
你可能要拿張紙寫些變數來驗證我的演算法....
這樣你就應該知道我為什麼這麼寫了.....

印列的部分就交給你改啦....
因為假如2位數*2位數答案只有3位數的話....
第4個位數的0還是會印出來啦.....
所以哪邊你自己在改一下就好....
我只是要驗證我的答案對不對....
所以就不改了....

複製程式
#include <stdio.h>
#include <iostream.h>

#define m 2
#define n 2

void main()
{
       int a[m]={5,1};
       int b[n]={0,3};
       int c[m+n];
       int temp;
       int i,j,k;
       for(k=0;k<m+n;k++)
                    c[k]=0;
       
       //主要演算法的部分
       for(j=0;j<n;j++)
       {
          for(i=0;i<m;i++)
         {
             temp= a[ i ]*b[j]+c[i+j];
             c[i+j]=temp%10;
             c[i+j+1]+=(temp/10);
                        }
               }
    
//列印答案
    for(k=m+n-1;k>=0;k--)
     printf("%d",c[k]);
}


記的自己把位數改大一點做測試....
我有寫錯再告訴我 表情 .....

此文章被評分,最近評分記錄
財富:100 (by Chiunyao) | 理由: 謝謝妳的熱心指導....


沒東西可以抓
獻花 x2 回到頂端 [4 樓] From:美國 | Posted:2005-04-09 11:05 |
Chiunyao 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
社區建設獎 特殊貢獻獎
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x4 鮮花 x776
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

複製程式
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main(void)
{
       srand(time(0));
       char a[3];
       char b[3];
       char c[6];
          char carry[6];
       int i,j,k,l;
          int temp=0;
       srand((unsigned)(time(NULL)));
       for(i=0;i<3;i++)
       {
              a[i]=rand()%10+0x30;
              b[i]=rand()%10+0x30;
       }
       while(a[2]==Ɔ')
       {
              a[2]=rand()%10+0x30;
       }
       while(b[2]==Ɔ')
              b[2]=rand()%10+0x30;
       for(j=0;i<3;i++)
          {
                 for(k=0;k<=j;k++)
                 {
                        temp+=(b[k]-0x30)*(a[j-k]-0x30);
                 }
                 carry[j]=((temp-0x30)/10)+0x30;
                 c[j]=((temp+(carry[j]-0x30))%(10*((temp+(carry[j]-0x30))/10)))+0x30;
          }
          for(l=2;l>=0;l--)
                 printf("%c",a[i]);
          printf("\n");
              for(l=2;l>=0;l--)
                     printf("%c",b[i]);
              printf("\n");
              for(l=5;l>=0;l--)
                     printf("%c",c[i]);
}




     


人要活在當下....才是最幸福的!!!
獻花 x0 回到頂端 [5 樓] From:台灣中華電信 | Posted:2005-04-09 12:15 |
唐老鴨
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x230
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

[quote]下面是引用Chiunyao於2005-04-9 12:15發表的 :

for(j=0;i<3;i++)
      {
          for(k=0;k<=j;k++)
          {
                temp+=(b[k]-0x30)*(a[j-k]-0x30);
            }
      carry[j]=((temp-0x30)/10)+0x30;
          c[j]=((temp+(carry[j]-0x30))%(10*((temp+(carry[j]-0x30))/10)))+0x30;
      }

我並沒有很仔細看你怎麼做的....
不過大概可以知道你錯在哪裡...
看下面的才對.... 表情


[ 此文章被唐老鴨在2005-04-09 12:58重新編輯 ]


沒東西可以抓
獻花 x0 回到頂端 [6 樓] From:美國 | Posted:2005-04-09 12:34 |
Chiunyao 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
社區建設獎 特殊貢獻獎
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x4 鮮花 x776
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

挖挖我懂了.....原來是這樣,我一直想我的演算法應該是沒有錯誤
怎麼跑不出來...

原來是轉換的問題....我在想想怎麼改...謝謝妳啦


     


人要活在當下....才是最幸福的!!!
獻花 x1 回到頂端 [7 樓] From:台灣中華電信 | Posted:2005-04-09 12:39 |
唐老鴨
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x230
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用Chiunyao於2005-04-9 12:39發表的 :
挖挖我懂了.....原來是這樣,我一直想我的演算法應該是沒有錯誤
怎麼跑不出來...

原來是轉換的問題....我在想想怎麼改...謝謝妳啦

妳的寫法有一個重大的問題....
我剛才講得可能有一點錯.....
沒注意看....
抱歉.....
你看這一段....
carry[j]=((temp-0x30)/10)+0x30;
如果你temp沒大於48的話....你相減就已經變成負數了.....
你算carry[j]那邊的邏輯絕對是有問題的.....


[ 此文章被唐老鴨在2005-04-09 13:02重新編輯 ]


沒東西可以抓
獻花 x0 回到頂端 [8 樓] From:美國 | Posted:2005-04-09 12:54 |
Chiunyao 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
社區建設獎 特殊貢獻獎
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x4 鮮花 x776
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

痾痾...鴨老大幫我看一下拉,我修改妳的...還是出現亂碼呢..是哪裡錯呢
複製程式
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
       srand(time(0));
       char a[3];
       char b[3];
       char c[6];
       int i,j,k,carry;
       int temp;
       srand((unsigned)(time(NULL)));

       for(i=0;i<3;i++)
       {
              a[i]=rand()%10+0x30;
              b[i]=rand()%10+0x30;
       }
       while(a[2]==Ɔ')
       {
              a[2]=rand()%10+0x30;
       }
       while(b[2]==Ɔ')
       {
              b[2]=rand()%10+0x30;
       }
        
       //主要演算法的部分
       for(j=0;j<3;j++)
       {
          for(i=0;i<3;i++)
         {
             temp=((a[i]-0x30)*(b[j]-0x30))+(c[i+j]-0x30);
             c[i+j]=(temp%10)+0x30;
             c[i+j+1]+=((temp/10)+0x30);
                }
          }
    
//列印答案
              for(i=2;i>=0;i--)
                 printf("%c",a[i]);
              printf("\n");
              for(i=2;i>=0;i--)
                 printf("%c",b[i]);
              printf("\n");
              for(i=5;i>=0;i--)
                 printf("%c",c[i]);
              printf("\n");
}



     


人要活在當下....才是最幸福的!!!
獻花 x0 回到頂端 [9 樓] From:台灣中華電信 | Posted:2005-04-11 22:49 |

<<   1   2  下頁 >>(共 2 頁)
首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.057870 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言