Option Base 1
Private Sub Command1_Click()
Dim arr() As Integer, m As Integer, i As Integer, a As Integer
For a = 0 To Op1.Count - 1
If Op1(a).Value = ture Then
m = Val(Op1(a).Caption)
End If
Next a
ReDim arr(m)
arr(1) = 1
arr(2) = 1
For i = 3 To m
arr(i) = arr(i - 1) + arr(i - 2) '這里 老是i=24的時候溢位
Next
Text1.Text = arr(m)
End Sub
uj5u.com熱心網友回復:
VB6.0中Integer 范圍為 -32,768 到 32,767 之間你這個值 46368 斐波那契數列(24)
超出范圍
Dim arr() As string, m As string,
還有那個 ture 拼錯了
uj5u.com熱心網友回復:
"數值“用整數,別用String 。
用Long型別最好,若是計算項數很多,還要”溢位“,用 Double 型別。
Dim arr() As Long 或者 Dim arr() As Double
其它幾個變更,用Long,或Integer都可以,差別不大。
uj5u.com熱心網友回復:
同意樓上的前半部分,arr()用long。數論方面的東西,看的就是整數,double型別精度不夠的話,數值光大沒用。uj5u.com熱心網友回復:
如果你要在你同學面前得瑟一下,可以將arr()定義為 variant 然后后面的運算都將資料轉換為 decimal 。這樣,可以將m算到139
Option Base 1
Private Sub Command1_Click()
Dim arr() As Variant, m As Currency, i As Long, a As Long
' For a = 0 To Op1.Count - 1
' If Op1(a).Value = ture Then
' m = Val(Op1(a).Caption)
' End If
' Next a
m = 139 'm最大可取值
ReDim arr(m)
arr(1) = 1
arr(2) = 1
For i = 3 To m
arr(i) = CDec(arr(i - 1)) + CDec(arr(i - 2))
Next
Text1.Text = arr(m)
End Sub
最后執行結果是 50095301248058391139327916261
uj5u.com熱心網友回復:
沒有具體算過,只是有一種“感覺”,用Long也要不了多少項就溢位了。
這個有點接近于 2^n 那種,開始不覺得怎么樣,到后面點就很恐怖了。
其實一般情況下,主要是掌握演算法問題,去算“很多項”并沒有多少意義。
所以我也沒想那么多。
uj5u.com熱心網友回復:
取決于你的 m 有多大。選擇合適的 arr() 資料型別。Long 型:i = 47 時溢位。
Currency 型:i = 74 時溢位。
Single 型:i = 187 時溢位。
Double 型:i = 1744 時溢位。Variant 型相同。
uj5u.com熱心網友回復:
如果要實作的數字較大,又要求精度的話,可以用自定義型別來計算。比如 LongLong 型。也有很多大數計算的演算法。舉一個容易理解的栗子。
你可以用兩個 Long 來表示你的數字,高位字表示百萬的個數,低位字表示百萬的余數。
兩個相加的數,高字與高字相加,低字與低字相加。當低字和超過百萬時,就減去百萬,將高字加 1(進位)。
這的栗子的好處是很容易轉換成 10 位元組的字串。高字生成的串放在前面,低字用 0 前填充到 6 位接到后面。
方法很多。
uj5u.com熱心網友回復:
僅供參考:// 按下列數級計算e的近視值,使e有小數點后1000位有效數字。
// e=1+1/1!+1/2!+1/3!+......1/n!
#include <iostream>
#include <string>
using namespace std;
inline int compare(string str1,string str2) {//相等回傳0,大于回傳1,小于回傳-1
if (str1.size()>str2.size()) return 1; //長度長的整數大于長度小的整數
else if (str1.size()<str2.size()) return -1;
else return str1.compare(str2); //若長度相等,則頭到尾按位比較
}
string SUB_INT(string str1,string str2);
string ADD_INT(string str1,string str2) {//高精度加法
int sign=1; //sign 為符號位
string str;
if (str1[0]=='-') {
if (str2[0]=='-') {
sign=-1;
str=ADD_INT(str1.erase(0,1),str2.erase(0,1));
} else {
str=SUB_INT(str2,str1.erase(0,1));
}
} else {
if (str2[0]=='-') {
str=SUB_INT(str1,str2.erase(0,1));
} else { //把兩個整數對齊,短整數前面加0補齊
string::size_type L1,L2;
int i;
L1=str1.size();
L2=str2.size();
if (L1<L2) {
for (i=1;i<=L2-L1;i++) str1="0"+str1;
} else {
for (i=1;i<=L1-L2;i++) str2="0"+str2;
}
int int1=0,int2=0; //int2 記錄進位
for (i=str1.size()-1;i>=0;i--) {
int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;
int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;
str=char(int1+'0')+str;
}
if (int2!=0) str=char(int2+'0')+str;
}
}
//運算后處理符號位
if ((sign==-1)&&(str[0]!='0')) str="-"+str;
return str;
}
string SUB_INT(string str1,string str2) {//高精度減法
int sign=1; //sign 為符號位
string str;
int i,j;
if (str2[0]=='-') {
str=ADD_INT(str1,str2.erase(0,1));
} else {
int res=compare(str1,str2);
if (res==0) return "0";
if (res<0) {
sign=-1;
string temp =str1;
str1=str2;
str2=temp;
}
string::size_type tempint;
tempint=str1.size()-str2.size();
for (i=str2.size()-1;i>=0;i--) {
if (str1[i+tempint]<str2[i]) {
j=1;
while (1) {//zhao4zhong1添加
if (str1[i+tempint-j]=='0') {
str1[i+tempint-j]='9';
j++;
} else {
str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);
break;
}
}
str=char(str1[i+tempint]-str2[i]+':')+str;
} else {
str=char(str1[i+tempint]-str2[i]+'0')+str;
}
}
for (i=tempint-1;i>=0;i--) str=str1[i]+str;
}
//去除結果中多余的前導0
str.erase(0,str.find_first_not_of('0'));
if (str.empty()) str="0";
if ((sign==-1) && (str[0]!='0')) str ="-"+str;
return str;
}
string MUL_INT(string str1,string str2) {//高精度乘法
int sign=1; //sign 為符號位
string str;
if (str1[0]=='-') {
sign*=-1;
str1 =str1.erase(0,1);
}
if (str2[0]=='-') {
sign*=-1;
str2 =str2.erase(0,1);
}
int i,j;
string::size_type L1,L2;
L1=str1.size();
L2=str2.size();
for (i=L2-1;i>=0;i--) { //模擬手工乘法豎式
string tempstr;
int int1=0,int2=0,int3=int(str2[i])-'0';
if (int3!=0) {
for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;
for (j=L1-1;j>=0;j--) {
int1=(int3*(int(str1[j])-'0')+int2)%10;
int2=(int3*(int(str1[j])-'0')+int2)/10;
tempstr=char(int1+'0')+tempstr;
}
if (int2!=0) tempstr=char(int2+'0')+tempstr;
}
str=ADD_INT(str,tempstr);
}
//去除結果中的前導0
str.erase(0,str.find_first_not_of('0'));
if (str.empty()) str="0";
if ((sign==-1) && (str[0]!='0')) str="-"+str;
return str;
}
string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1時,回傳商; flag==0時,回傳余數
string quotient,residue; //定義商和余數
int sign1=1,sign2=1;
if (str2 == "0") { //判斷除數是否為0
quotient= "ERROR!";
residue = "ERROR!";
if (flag==1) return quotient;
else return residue ;
}
if (str1=="0") { //判斷被除數是否為0
quotient="0";
residue ="0";
}
if (str1[0]=='-') {
str1 = str1.erase(0,1);
sign1 *= -1;
sign2 = -1;
}
if (str2[0]=='-') {
str2 = str2.erase(0,1);
sign1 *= -1;
}
int res=compare(str1,str2);
if (res<0) {
quotient="0";
residue =str1;
} else if (res == 0) {
quotient="1";
residue ="0";
} else {
string::size_type L1,L2;
L1=str1.size();
L2=str2.size();
string tempstr;
tempstr.append(str1,0,L2-1);
for (int i=L2-1;i<L1;i++) { //模擬手工除法豎式
tempstr=tempstr+str1[i];
tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加
if (tempstr.empty()) tempstr="0";//zhao4zhong1添加
for (char ch='9';ch>='0';ch--) { //試商
string str;
str=str+ch;
if (compare(MUL_INT(str2,str),tempstr)<=0) {
quotient=quotient+ch;
tempstr =SUB_INT(tempstr,MUL_INT(str2,str));
break;
}
}
}
residue=tempstr;
}
//去除結果中的前導0
quotient.erase(0,quotient.find_first_not_of('0'));
if (quotient.empty()) quotient="0";
if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;
if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;
if (flag==1) return quotient;
else return residue ;
}
string DIV_INT(string str1,string str2) {//高精度除法,回傳商
return DIVIDE_INT(str1,str2,1);
}
string MOD_INT(string str1,string str2) {//高精度除法,回傳余數
return DIVIDE_INT(str1,str2,0);
}
int main() {
string s1,s2,s3,s4;
int i;
s4="0";
s3="1";
for (i=0;i<1002;i++) s3+="0";
s1="1";
s2="1";
s4=ADD_INT(s4,DIV_INT(s3,s1));
s4=ADD_INT(s4,DIV_INT(s3,s1));
for (i=2;i<451;i++) {//因為450!是一個1001位數
s2=ADD_INT(s2,string("1"));
s1=MUL_INT(s1,s2);
s4=ADD_INT(s4,DIV_INT(s3,s1));
}
cout<<s4<<endl;
return(0);
}
//271828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992
//181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924
//476146066808226480016847741185374234544243710753907774499206955170276183860626133138458300075204493382656029760673711320
//070932870912744374704723069697720931014169283681902551510865746377211125238978442505695369677078544996996794686445490598
//793163688923009879312773617821542499922957635148220826989519366803318252886939849646510582093923982948879332036250944311
//730123819706841614039701983767932068328237646480429531180232878250981945581530175671736133206981125099618188159304169035
//159888851934580727386673858942287922849989208680582574927961048419844436346324496848756023362482704197862320900216099023
//530436994184914631409343173814364054625315209618369088870701676839642437814059271456354906130310720851038375051011574770
//4171898610687396965521267154688957035035174
uj5u.com熱心網友回復:
近視→近似uj5u.com熱心網友回復:

果然“近視”,連小數點都沒添加上去……
uj5u.com熱心網友回復:
整數運算模擬定點小數運算,小數點位置按照事先約定位置自己腦補點上吧。
uj5u.com熱心網友回復:
貌似我又開了個壞頭,其實樓主的問題一看就是課堂上的小練習啦。我給的例子也是給他一個簡單又能在同學面前嘚瑟的方案。uj5u.com熱心網友回復:
Private Sub Command1_Click()
Dim arr_1() As Long, arr_2() As Long, arr_3() As Long, arr_4() As Long, m As Integer, i As Integer
m = 175
ReDim arr_1(m)
ReDim arr_2(m)
ReDim arr_3(m)
ReDim arr_4(m)
arr_1(1) = 1
arr_1(2) = 1
For i = 3 To m
arr_1(i) = arr_1(i - 1) + arr_1(i - 2)
arr_2(i) = arr_2(i - 1) + arr_2(i - 2)
arr_3(i) = arr_3(i - 1) + arr_3(i - 2)
arr_4(i) = arr_4(i - 1) + arr_4(i - 2)
If arr_1(i) > 1000000000 Then
arr_1(i) = arr_1(i) - 1000000000
arr_2(i) = arr_2(i) + 1
End If
If arr_2(i) > 1000000000 Then
arr_2(i) = arr_2(i) - 1000000000
arr_3(i) = arr_3(i) + 1
End If
If arr_3(i) > 1000000000 Then
arr_3(i) = arr_3(i) - 1000000000
arr_4(i) = arr_4(i) + 1
End If
Next i
Text1.Text = Format(arr_4(m), "## ### ### ### ") & Format(arr_3(m), "000 000 000 ") & _
Format(arr_2(m), "000 000 000 ") & Format(arr_1(m), "000 000 000")
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/45257.html
標籤:VB基礎類
