這道題主要是考察數的高精度乘法,使用陣列儲存資料,陣列中的元素對於高精度資料中的某一位。我用的思想很簡單,類似我們手算乘法時採用的步驟,這是在兩層的for()迴圈中實現的。需要注意乙個問題,如果採用unsigned char型儲存元素,在運算的過程中rslt元素的中間結果可能超過255,造成乘法結果的中間部分資料不正確。因此,rslt進行累加時,需要及時進製。在我的程式中,對資料有效位前後有0的情況做了處理,避免乘法過程中出現過多不必要的運算。但這也導致剛開始對10.0000這樣的資料處理出現錯誤,後來用dotpos的正負表示小數點的位置,解決了此問題。
另外,對於高階次冪,減少乘法使用的次數,採用降冪的思想。如2^9,可以看成(4^4)*2,進一步(16^2)*2。但是如何實現?這裡,可以根據冪的二進位制形式進行處理,如9表示成1001, 25表示成11001。具體見**。注釋部分採用這種思想,在vc執行通過。由於gcc沒有對itoa實現,故submit的時候還用的傳統方法。
#include /*#include */
#include unsigned char rslt[200] = ;
int do_multiple(unsigned char *multia, unsigned char *multib, int lena, int lenb)
} for(k = lena+lenb-1; rslt[k] == '\0'; k--){}
return (k+1);
}int main(void)
; int i, j;
while(scanf("%s %d", num, &power) == 2)
i -= (dotpos != 0);
for(--i; (num[i] == '0'); i--){}
num[i+1] = '\0';
num_len = strlen(num);
dotpos = num_len - dotpos;
for(j = 0; i >= 0; i--)
memcpy(rslt, reversenum, num_len);
rslt_len = num_len;
for(i = 1; i < power; i++)
/* for(i = 1; i < (signed)strlen(power_buf); i++)
}*/ dotpos *= power;
if(dotpos >= rslt_len)
for(i = rslt_len; i > 0; i--)
while(dotpos++ < 0)
putchar('0');
putchar('\n');
} return 0;
}
POJ 1001 解題報告
這是一道基礎的高精度的題目。對於高精度的題目,頭腦一定要清晰,一定要細心。這種題,錯的話還是比較難改的 除非用debug,好吧,我用了 基本思路就是把所有的數字反過來存放在字串陣列中,然後一位一位的模擬手算。要注意的是 1 字元 n 和數字n之間的轉換要搞清 2 每次更新是盡量把陣列清零,否則可能使...
大數相關poj1001
go.cpp 定義控制台應用程式的入口點。include stdafx.h include include include include include include includeusing namespace std const long base 10000 class bigintege...
POJ 1001 高精度乘法
必須去掉前導0和後導0,乙個特殊資料是對000.00這樣的輸出0 include includeusing namespace std int main while n 2 如果小於2直接輸出 for int i 0 i dianwei i 從左往右去掉0 int lastindex 1 for i...