English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

(1) 輸入M和N,用十進位寫下M到N之間所有的整數(可能包含負整數),M和N佔4個bytes的長整數且0<=M<=N,他總共需要寫下多少個「0」?

以下是我寫的,但是只要數字很大就會跑很慢,請各位大大幫我想想怎麼讓他跑快一點,拜託~~~
Private Sub Command1_Click()
Open App.Path & "\\in.txt" For Input As #1
Open App.Path & "\\out.txt" For Output As #2
Input #1, a
For i = 1 To Val(a)
s = 0
Input #1, m, n
mm = IIf(Val(Right(m, 1)) <> 0, Val(m) - Val(Right(m, 1)), Val(m))
If mm = 0 Then s = s + 1
For j = m To n Step 10
s = s + Len(Trim(Str(j))) - 1
Next j
Print #2, s
Next i
Close
Unload Me
End Sub

2006-09-08 03:34:37 · 9 個解答 · 發問者 以晴 2 in 電腦與網際網路 程式設計

我知道雙核心很快沒錯,可是也要系統跟應用程式可以支援啊~~ 我懶得再去找這一類的東西了(而且要花錢,我很窮的...),請幫我用程式讓他可以在較短的時間內執行完畢,我會非常非常的感謝你的~~~

2006-09-08 03:54:48 · update #1

9 個解答

目前因為沒有vb可以寫, 我用Java把演算法寫出來
你想辦法把它轉成vb就可以用了

public static void main(String[] args) {

long qu1 = -1018, qu2 = 1009;

long r1 = getZero( Math.abs(qu1) );
long r2 = getZero( Math.abs(qu2) );

if( qu2 < qu1 )
return;

if( qu1 * qu2 < 0 )
System.out.println( r1 + r2 - 1 );
else
System.out.println( r2 - r1 );


// 以下為驗證程式碼
long count = 0;

for( long i = qu1; i <= qu2; i++ ) {

String s = String.valueOf(i);

for( int j = 0; j < s.length(); j++ ) {

if( s.charAt(j) == '0' )
count++;
}
}

System.out.println(count);

}



// 取得0~src共出現幾個0的方法
private static long getZero(long src) {

String s = String.valueOf(src).trim();
int[] ar = new int[ s.length() ];

for( int i = 0; i < ar.length; i++ ) {

ar[i] = s.charAt(i) - 0x30;
}

long count = 0;

for( int i = 0; i < ar.length - 1; i++ ) {

long t1 = 0;

for( int j = 0; j <= i; j++ ) {

t1 *= 10;
t1 += ar[j];
}

if( ar[i + 1] != 0 ) {

t1 *= (long)( Math.pow(10, ar.length - 2 - i) );
}
else {

t1 = ( t1 - 1 ) *(long)( Math.pow(10, ar.length - 2 - i) );

long t2 = 0;

for( int j = i + 2; j < ar.length; j++ ) {

t2 *= 10;
t2 += ar[j];
}

t1 += t2 + 1;
}
count += t1;
}

return count + 1;
}

2006-09-08 17:31:08 補充:
哇哩咧...<的符號全部變成 < 了..你自己看著辦吧..= =+

2006-09-12 10:36:53 補充:
這種東西用手算也算得出來呀EX:
0-420567會出現幾個0
答案=40000+41568+42000+42050+42056+1
數字大一點的話..用手算都比電腦跑暴力法來得快= =

2006-09-08 13:24:41 · answer #1 · answered by 岔題與亂回文程度的能力 4 · 0 0

這一題....很眼熟
熟到不行....XD

2006-11-14 13:24:15 · answer #2 · answered by ? 4 · 0 0

ㄘㄟˊ...
VB專題問題
用Java寫的居然票選第一名
下次我也用JAVA來試試...

2006-09-19 04:51:55 · answer #3 · answered by ㄚ旺 5 · 0 0

TO:阿戊(ㄨˋ)
a是整個檔案的第一行,主要記錄著總共要讀取幾筆資料加以計算。
至於”(可能包含負整數)”這種矛盾的說明是我老眼昏花...看錯行了......(SORRY)

程式寫錯0.0)? 看來,我還有很大的進步空間...

TO:puppy
為什麼要讀寫檔案?這個你就要去問我的老師了,根據他的說法是「這樣我比較好檢查。」

2006-09-11 15:36:35 · answer #4 · answered by 以晴 2 · 0 0

'我也來暴力一下Private Sub Command1_Click()    Dim I&, N&, M&, T&        For I = N To M        T = T + UBound(Split(I, "0"))    Next    Print TEnd Sub

2006-09-11 14:40:32 · answer #5 · answered by W.J.S. 7 · 0 0

阿戊(ㄨˋ) ,救命ㄚ,我問題解不出來,看我的發問問題裡的第一個問題,幫我解一下,感謝了。

2006-09-10 12:05:14 · answer #6 · answered by 天殺的孤小愁 6 · 0 0

a是什麼,沒交待!

2006-09-08 11:49:45 補充:
而且條件:0<=M<=N
前面怎還會有:”(可能包含負整數)”這種矛盾的說明!?

2006-09-08 12:35:43 補充:
還有...程式算出的0的次數不對
比如 1-100
應該要寫11個0(因為100有兩個)
而你的程式中只算出10個.

2006-09-08 15:33:49 補充:
原來可以用暴力法的嗎?!...那這樣會更快一點:s = 0For i = m To n s = s + Len(i) - Len(Replace(i, "0", ""))Next imsgbox s

2006-09-08 11:33:49 · answer #7 · answered by ? 7 · 0 0

只是要算寫下幾個0,幹麼讀寫檔案?

2006-09-08 15:11:17 補充:
你原先的程式會慢,應該是迴圈不斷寫入s(Print #2, s)造成.
只要把Print #2, s這一行擺到迴圈外即可.
不過程式碼還是有問題.

最簡單的暴力法就這樣
Private Sub Command1_Click()
m = -100
n = 100
s = 0
For i = m To n
num = Len(i)
For j = 1 To num
If Mid(i, j, 1) = "0" Then
s = s + 1
End If
Next j
Next i
Print s
End Sub

2006-09-08 11:11:17 · answer #8 · answered by puppy 5 · 0 0

換台電腦
雙核心+6g ram+獨立顯示卡
一定跑的飛快
以上

2006-09-08 03:48:04 · answer #9 · answered by LKK 3 · 0 0

fedest.com, questions and answers