伊莉討論區
標題:
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的二十次方
這是我打的
#include <iostream>
using namespace std;
int main() {
int n = 0,total=0,a=0;
for(n = 1; total < 1e20 ;n++)
a= n+ 1
total = a + 1;
if(total > 1e20)
cout << " " << total;
return 0;
system("pause");
}
複製代碼
請問該怎樣改或是怎樣做 我剛學 很多地方都不懂 歡迎指導~
作者:
goodbye_mylove
時間:
2011-12-21 02:35 AM
回復
1#
葬魂
1+..+ n > 10^20 有效率的演算法
作者:
葬魂
時間:
2011-12-21 08:55 PM
這是我同學打的 他是用VB寫的
Private Sub Command1_Click()
Cls
Dim a As Double
Dim b As Double
Dim c As Double
a = InputBox("請輸入正整數")
b = 0
c = 0
Do Until b > a
c = c + 1
b = b + c
Loop
Print c
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 編輯
我後來發現...
這題好像只要考慮大數字,
再搭配迴圈,
答案就可以輕易出現,
但...有效率的做法...我還是不太會,
以下是我的程式碼...,
有點後悔沒有加上註解,
希望大大看得懂,
而且,可能會跑很久,請耐心等待!!
# include <iostream>
using namespace std ;
string intput_num_string() { // 限制 input 的 string
string str = "" , output_string = "" ;
int quit = 1 , transfer = 0 ;
while( quit != 0 ) {
cin >> str ;
if ( str == "quit" ) exit( 0 ) ;
quit = 0 ;
for ( int i = 0 ; i < str.length() ; i++ ) {
if ( str[ i ] >= 48 && str[ i ] < 58 ) ;
else quit = 1 ;
}
if ( quit == 1 ) cout << "抱歉,請輸入數字,或輸入 quit 離開." << endl ;
} // while( quit != 0)
for ( int i = 0 ; i < str.length() ; i++ ) {
if ( str[ i ] != 48 && transfer == 0 ) transfer = 1 ;
if ( transfer == 1 ) output_string += str[ i ] ;
} // for ( int i = 0 ; i < str.length() ; i++ )
if ( output_string == "" ) output_string += "0" ;
return output_string ;
} // intput_num_string()
string Add_str( string str1, string str2 ) { // 做兩數字的相加,但兩數字的 type 為 string
string temp = "" , transfer = "0" ;
int A = 0, B = 0, sum = 0 , carrier = 0;
if ( str1.length() < str2.length() ) {
temp = str1 ;
str1 = str2 ;
str2 = temp ;
} // if ( str1.length() > str2.length() )
temp = "" ;
for ( int i = 0 ; i < str1.length() ; i++ ) {
A = str1[ str1.length() - 1 - i ] - 48 ;
if ( i > str2.length() - 1 ) B = 0 ;
else B = str2[ str2.length() - 1 - i ] - 48 ;
sum = A + B + carrier ;
//temp += temp[ temp.length() - 1 ] ;
// for ( int j = 1 ; j < temp.length() ; j++ ) temp[ temp.length() - 1 - j ] = temp[ temp.length() - 2 - j ] ;
temp += ( char ) ( sum % 10 ) + 48 ;
if ( sum >= 10 ) carrier = 1 ;
else carrier = 0 ;
if ( i == str1.length() - 1 )
if ( carrier == 1 )
temp += ( char ) 1 + 48 ;
} // for ( int i = str1.length() - 1 ; i >= 0 ; i-- )
for ( int i = 0 ; i < temp.length() / 2 ; i++ ) {
transfer[ 0 ] = temp[ i ] ;
temp[ i ] = temp[ temp.length() - 1 - i ] ;
temp[ temp.length() - 1 - i ] = transfer[ 0 ] ;
} // for ( int i = 0 ; i < temp.length() / 2 ; i++ )
return temp ;
} // Add_str()
int main() {
string count = "0", sum = "0" ;
int quit = 1 ;
// 運算 1+2+3+4+5+......n > 10*20
while( quit != 0 ) {
count = Add_str( count , "1" ) ;
sum = Add_str( sum , count ) ;
if ( sum.length() >= 21 ) {
if ( sum == "100000000000000000000" ) ;
else quit = 0 ;
} // if ( sum.length() >= 21 )
cout << sum << endl ;
} // while( quit != 0 )
cout << count << endl ;
system( "pause" ) ;
return 0 ;
} // 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!