伊莉討論區

標題: C++ 迴圈問題 [打印本頁]

作者: 葬魂    時間: 2011-12-20 11:12 PM     標題: C++ 迴圈問題

本帖最後由 葬魂 於 2011-12-20 11:14 PM 編輯

請問一下

1+2+3+4+5+......n > 10*20

1加到n大於 10的二十次方 求 當n等於多少時大於10的二十次方

這是我打的
  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4.     int n = 0,total=0,a=0;
  5.     for(n = 1; total < 1e20 ;n++)
  6.     a= n+ 1
  7.     total = a + 1;
  8.     if(total > 1e20)
  9.     cout << " " << total;
  10.     return 0;
  11.     system("pause");
  12. }
複製代碼


請問該怎樣改或是怎樣做 我剛學 很多地方都不懂 歡迎指導~
作者: goodbye_mylove    時間: 2011-12-21 02:35 AM

回復 1# 葬魂
1+..+ n > 10^20 有效率的演算法

作者: 葬魂    時間: 2011-12-21 08:55 PM

這是我同學打的 他是用VB寫的
  1. Private Sub Command1_Click()
  2. Cls
  3. Dim a As Double
  4. Dim b As Double
  5. Dim c As Double
  6. a = InputBox("請輸入正整數")
  7. b = 0
  8. c = 0
  9. Do Until b > a
  10. c = c + 1
  11. b = b + c
  12. Loop
  13. Print c
  14. End Sub
複製代碼
請問一下為什麼他看起來沒有用什麼特別的東西 一樣可以算出答案
作者: B1DE49FC    時間: 2011-12-21 09:15 PM

double 可以計算沒有錯
但是會失去精確度

若要考慮到精準度還是得用到大數運算
作者: 葬魂    時間: 2011-12-21 09:32 PM

本帖最後由 葬魂 於 2011-12-21 10:25 PM 編輯

那為什麼他可以算出一模一樣的答案

請問精準度是什麼意思啊?
作者: goodbye_mylove    時間: 2011-12-21 11:34 PM

本帖最後由 goodbye_mylove 於 2011-12-21 11:45 PM 編輯

他答案也是錯的,就這樣。

edisonx . pixnet . net / blog / post / 46103946
edisonx . pixnet . net / blog / post / 83619317

連結去空白,其他自己慢慢看。
作者: sorry320    時間: 2012-1-4 06:14 PM

本帖最後由 sorry320 於 2012-1-4 06:21 PM 編輯

其實,以10的20次方來說,
數字真的有點大,
所以,我建議可以兩邊取log10
就變成,log10(1 + 2 + 3 + ... + n) > 20,
這樣在計算上會比較容易
作者: sorry320    時間: 2012-1-7 03:25 AM

本帖最後由 sorry320 於 2012-1-7 03:53 AM 編輯

我後來發現...
這題好像只要考慮大數字,
再搭配迴圈,
答案就可以輕易出現,
但...有效率的做法...我還是不太會,
以下是我的程式碼...,
有點後悔沒有加上註解,
希望大大看得懂,
而且,可能會跑很久,請耐心等待!!
  1. # include <iostream>
  2. using namespace std ;

  3. string intput_num_string() { // 限制 input 的 string
  4.   
  5.   string str = "" , output_string = "" ;
  6.   int quit = 1 , transfer = 0 ;
  7.   
  8.   while( quit != 0 ) {
  9.    
  10.     cin >> str ;
  11.     if ( str == "quit" ) exit( 0 ) ;
  12.    
  13.     quit = 0 ;
  14.    
  15.     for ( int i = 0 ; i < str.length() ; i++ ) {
  16.       if ( str[ i ] >= 48 && str[ i ] < 58 ) ;
  17.       else quit = 1 ;
  18.     }

  19.     if ( quit == 1 ) cout << "抱歉,請輸入數字,或輸入 quit 離開." << endl ;

  20.   } // while( quit != 0)
  21.   
  22.   for ( int i = 0 ; i < str.length() ; i++ ) {
  23.     if ( str[ i ] != 48 && transfer == 0 ) transfer = 1 ;
  24.     if ( transfer == 1 ) output_string += str[ i ] ;
  25.   } // for ( int i = 0 ; i < str.length() ; i++ )
  26.   
  27.   if ( output_string == "" ) output_string += "0" ;
  28.   
  29.   return output_string ;
  30.   
  31. } // intput_num_string()
  32. string Add_str( string str1, string str2 ) { // 做兩數字的相加,但兩數字的 type 為 string
  33.   
  34.   string temp = "" , transfer = "0" ;
  35.   int A = 0, B = 0, sum = 0 , carrier = 0;
  36.   
  37.   if ( str1.length() < str2.length() ) {
  38.     temp = str1 ;
  39.     str1 = str2 ;
  40.     str2 = temp ;
  41.   } // if ( str1.length() > str2.length() )
  42.   
  43.   temp = "" ;
  44.   
  45.   for ( int i = 0 ; i < str1.length() ; i++ ) {
  46.    
  47.     A = str1[ str1.length() - 1 - i ] - 48 ;
  48.     if ( i > str2.length() - 1 ) B = 0 ;
  49.     else B = str2[ str2.length() - 1 - i ] - 48 ;
  50.    
  51.     sum = A + B + carrier ;
  52.     //temp += temp[ temp.length() - 1 ] ;
  53.     // for ( int j = 1 ; j < temp.length() ; j++ ) temp[ temp.length() - 1 - j ] = temp[ temp.length() - 2 - j ] ;
  54.     temp += ( char ) ( sum % 10 ) + 48 ;
  55.    
  56.     if ( sum >= 10 ) carrier = 1 ;
  57.     else carrier = 0 ;
  58.    
  59.     if ( i == str1.length() - 1 )
  60.       if ( carrier == 1 )
  61.       temp += ( char ) 1 + 48 ;
  62.       
  63.   } // for ( int i = str1.length() - 1 ; i >= 0 ; i-- )  
  64.   
  65.   for ( int i = 0 ; i < temp.length() / 2 ; i++ ) {
  66.     transfer[ 0 ] = temp[ i ] ;
  67.     temp[ i ] = temp[ temp.length() - 1 - i ] ;
  68.     temp[ temp.length() - 1 - i ] = transfer[ 0 ] ;
  69.   } // for ( int i = 0 ; i < temp.length() / 2 ; i++ )
  70.   
  71.   return temp ;
  72.   
  73. } // Add_str()
  74. int main() {
  75.   
  76.   string count = "0", sum = "0" ;
  77.   int quit = 1 ;
  78.   
  79.   // 運算 1+2+3+4+5+......n > 10*20
  80.   while( quit != 0 ) {
  81.    
  82.     count = Add_str( count , "1" ) ;
  83.    
  84.     sum = Add_str( sum , count ) ;
  85.    
  86.     if ( sum.length() >= 21 ) {
  87.       if ( sum == "100000000000000000000" ) ;
  88.       else quit = 0 ;
  89.     } // if ( sum.length() >= 21 )
  90.     cout << sum << endl ;
  91.   } // while( quit != 0 )
  92.   
  93.   cout << count << endl ;
  94.   
  95.   system( "pause" ) ;
  96.   return 0 ;
  97. } // main()
複製代碼
不多不少...剛剛好100行

請服用。

(粗略估計後...似乎要跑上數天,不知是否是小弟電腦不佳 )
作者: goodbye_mylove    時間: 2012-1-7 04:00 PM

回復 8# sorry320


和電腦沒關係,可能有哪裡邏輯有問題,
或 class 帶來之 slide effect 過大。

1秒版 (連結去空白)
edisonx . pixnet . net / blog / post / 83619317




歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!