程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 要心中有“數”——C語言初學者代碼中的常見錯誤與瑕疵(8)

要心中有“數”——C語言初學者代碼中的常見錯誤與瑕疵(8)

編輯:關於C語言

中,我給出的重構代碼中存在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 + 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved