Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。
很長的數字轉換問題
隨性想寫一個長度為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函式回傳值為轉換後的陣列長度