Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。

ㄚ旺
Lv 5
ㄚ旺 發問於 電腦與網際網路程式設計 · 1 十年前

很長的數字轉換問題

隨性想寫一個長度為100位的數字乘以100位的數字功能的程式,但是遇到了一個問題。希望各位先進不吝指教。

問題:我要怎樣寫一個程式,才能將一個10進位的數值放到宣告好的陣列中。

範例1:

unsigned char b[2];

char *valueStr=\"4660\";   // (若將\"4660\"轉為16進位為0x1234)

unknowFunc(valueStr, b); // 執行這個未知的函數後會令b[0]=0x34; 且b[1]=0x12;

for(int i=2;i>=0;i--)

printf(\"%X \",b[i]); // 輸出結果為 12 34

範例2:

unsigned char b[512];

char *valueStr = \"1892730132049651893274505143285931409109378510938264508931708596134613784250981723761340910935106430321\";

// 執行底下這個未知的函數後會令valueStr內的數值資料,轉換成16進位擺入陣列中.

unknowFunc(valueStr, b); 

for(int i=512;i>=0;i--)

printf(\"%X \",b[i]);

// 由於 atol() / atoi() 等 function 只提供固定長度的轉換,較大的數值因此無法使用

// 撰寫前提是變數 valueStr 必須為10進位之文字數字

// 撰寫之程式必須以 C language 完成

// 請問各位先進,這個unknowFunc()該怎樣寫;或是有其他方式可以解決,感謝!

2 個解答

評分
  • 1 十年前
    最愛解答

    我想到的方法就只有用除法慢慢作,程式碼在下面

    另外,雖然你是說轉成16進位,但是看你給的例子應該是兩個byte為一個單位,所以其實是把他化成256進位來紀錄

    如果程式碼有什麼不懂的地方我再做說明囉

    int convert(char* a, unsigned char *b) {

     int i, len = strlen(a), j = 0, k = 0, tp;

     int * c = new int[len];

     for (i = 0; i < len; i++)

      c[i] = a[i] - '0';

      while (k < len) {

       tp = 0;

       for (i = k; i + 1 < len; i++) {

        c[i + 1] += c[i] % 256 * 10;

        c[i] /= 256;

       }

       b[j++] = c[i] % 256;

       c[i] /= 256;

       while (k < len && c[k] == 0)

        k++;

     }

     return j;

    }

    2006-07-28 20:35:43 補充:

    第二行改成1個byte函式回傳值為轉換後的陣列長度

  • ㄚ旺
    Lv 5
    1 十年前

    這個程式是我要要來研究因式分解用的

    3q

還有問題嗎?立即提問即可得到解答。