中,我給出的重構代碼中存在BUG。這個BUG是在飛鳥_Asuka網友指出“是不是時間復雜度比較大”,並說他“第一眼看到我就想把它當成一個數學問題來做”之後,我又重新對問題進行了數學式的思考後發現的。
#include <stdio.h> main( i , sum = ( i = ; i <= ; i +++=
#include <stdio.h> main( , ( + ) * /
)。“矩形的個數”問題應該說還不是那麼容易得到數學解的。
飛鳥_Asuka 網友說他“第一眼看到我就想把它當成一個數學問題來做”之後,我也嘗試著用數學的方式思考了一下。我發現,在同一條直線上的n個不同的點一共可以構成(n-1)n/2條不同的線段,A*B的矩形相鄰兩邊各有A+1和B+1個不同的點,因而可以分別構成(A+1)A/2和(B+1)B/2條不同的線段,這樣構成的矩形的個數一共就是(A+1)A/2×(B+1)B/2個。當A和B取最大值1000時,結果顯然不小於25×1010,而這個值顯然大於231-1,甚至也大於232-1(多數編譯器中 unsigned 類型所能表示的最大整數)。這樣,原來的重構代碼中用int類型作為結果的類型,顯然錯了。
)
飛鳥_Asuka 網友指出“是不是時間復雜度比較大”的問題也是存在的。但當時為了算法敘述的方便,就沒有按照下面的方法寫count()函數:
count( A , x1 , y1 ; x2 , y2 ; num = ( x1 = ; x1 < B ; x1 ++ ) ( y1 = ; y1 < A ; y1 ++ ) ( x2 = x1 + ; x2 <= B ; x2 ++ ) ( y2 = y1 + ; y2 <= A ; y2 ++ ) num ++ ;
( x1 = ; x1 < B ; x1 ++ ( x2 = x1 + ; x2 <= B ; x2 ++ ( y1 = ; y1 < A ; y1 ++ ( y2 = y1 + ; y2 <= A ; y2 ++++ ;
10,這並不是一個很大的數,一個int不夠,那就用兩個好了。這裡把存儲大數的數據結構設計為一數組,
typedef BIG_NUM[] ;
9,在int類型的表示范圍之內)。
count( BIG_NUM m , A , ] = ] = mul_sum( m , B ); }
mul_sum( BIG_NUM m , t1 = n % == ? n / = n % != ? (n + ) / : n +
mul( BIG_NUM m , ] *=] *=] += m[]/; m[] %=
( m[] == , m[ , m[ , m[
<stdio.h>typedef BIG_NUM[ count( BIG_NUM , , mul_sum( BIG_NUM , mul( BIG_NUM , POW 1000000 WID 6 main( ( printf( , &A , &B )!= ( m[] == , m[ , m[ , WID , m[ mul( BIG_NUM m , ] *=] *=] += m[]/POW; m[] %= count( BIG_NUM m , A , ] = ] = mul_sum( m , B ); mul_sum( BIG_NUM m , t1 = n % == ? n / = n % != ? (n + ) / : n +