POJ 1001 解題報告

2021-05-27 22:28:01 字數 1351 閱讀 6688

這道題主要是考察數的高精度乘法,使用陣列儲存資料,陣列中的元素對於高精度資料中的某一位。我用的思想很簡單,類似我們手算乘法時採用的步驟,這是在兩層的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...