**:
高精度的計算包括幾個方面:
1:對資料的訪問
2:對資料的加減乘除(運算)
下面我將用著兩部分來講解:
1:高精度的訪問.
2高精度的運算
1:用字串讀入然後轉換成陣列.
#include #include using namespace std;
const int n=100;//最多100位
int main()
2:直接讀取(這種針對數字本身沒有超界的)
#include using namespace std;
const int n=100;//最多100位
int main()
a[0]=i; //共i位數
return 0;
}
2:高精度的運算:
1比較:
int compare(int a,int b) //比較a和b的大小關係,若a>b則為1,ab[0]) return 1;//a的位數大於b則a比b大
if (a[0]0;i--) //從高位到低位比較
}
3:高精度減法:
int gminus(int a,int b);//計算a=a-b,返加符號位0:正數 1:負數
//若a=b,則a=0,也可在return前加一句a[0]=1,表示是 1位數0
if(flag==1) //大於
//單獨處理key=0
for(i=1;i<=a[0];i++)a[i]=a[i]*key;//先每位乘起來
for(i=1;i<=a[0];i++) //進製
//注意上一語句退出時i=a[0]+1
while(a[i]>0) //繼續處理超過原a[0]位數的進製,修正a的位數
return 0;
}
高精度除法:演算法:按照從高位到低位的順序,逐位相除。在除到第j位時,該位在接受了來自第j+1位的餘數後與除數相除,如果最高位為零,則商的長度減一。源程式如下(模擬豎式的運算)
#include #define n 500
main()
, c[n] = ;
int i, k, d, b;
char a1[n];
printf("input 除數:");
scanf("%d", &b);
printf("input 被除數:");
scanf("%s", a1);
k = strlen(a1);
for(i = 0; i < k; i++) a[i] = a1[k - i - 1] - '0';
d = 0;
for(i = k - 1; i >= 0 ; i--)
while(c[k - 1] == 0 && k > 1) k--;
printf("商=");
for(i = k - 1; i >= 0; i--) printf("%d", c[i]);
printf("\n餘數=%d", d);
}
高精度乘以高精度:演算法:用陣列儲存兩個高精度數,然後逐位相乘,注意考慮進製和總位數。源程式如下:
#include main()
, b[240] = , c[480] = ;
int i, j, ka, kb, k;
char a1[240], b1[240];
gets(a1);
ka = strlen(a1);
gets(b1);
kb = strlen(b1);
k = ka + kb;
for(i = 0; i < ka; i++) a[i] = a1[ka-i-1] - '0';
for(i = 0; i < kb; i++) b[i] = b1[kb-i-1] - '0';
for(i = 0; i < ka; i++)
for(j = 0; j < kb; j++)
if(!c[k]) k--;
for(i = k-1; i >= 0; i--) printf("%d", c[i]);
}
高精度初一高精度:
#include #define n 500
int bj(int a, int b, int k1, int k2) /*比較大小函式*/
else if(a[i] == b[i]) i--;
else
}if(i == 0 && t == 0) flag = 2; /*被除數等於除數返回2*/
}return flag;
}int jf(int a, int b, int k1, int k2) /*減法運算*/
for(i = 0; i < k1; i++)
}return k;
}main()
, b[n] = , c[n] = , d[n] = ;
int i, ka, kb, m, t, t1, t2, k, x, kd, kk;
char a1[n], b1[n];
printf("input 被除數:");
scanf("%s", a1);
ka = strlen(a1);
for(i = 0; i < ka; i++) a[i] = a1[ka - i -1] - '0';
printf("input 除數:");
scanf("%s", b1);
kb = strlen(b1);
for(i = 0; i < kb; i++) b[i] = b1[kb - i -1] - '0';
kd = ka; /*儲存被除數字數 */
t2 = bj(a, b, ka, kb);
m = 0;
doif(t1 > 0)
}}while(t == 1);
if(t2 == 0)
if(t2 == 2)
kk = kd;
while(!c[kd - 1]) kd--;
printf("商 = ");
for(i = kd - 1; i >= 0; i--) printf("%d", c[i]);
while(!a[kk]) kk--;
printf("\n餘數 = ");
if(kk < 0)
for(i = kk; i >= 0; i--) printf("%d", a[i]);
}
高精度計算
最近做了一些高精度計算問題,一般來說解題辦法都差不多,都是通過字串來操作的,下面是解題模板。清零操作 string clearstr string s if s return s 0 while s.length 0 s 0 0 s.erase 0,1 刪除第乙個零 if s return s 0 ...
高精度計算
include include includeusing namespace std const int l 110 string add string a,string b 只限兩個非負整數相加 nb l int la a.size lb b.size for int i 0 ilb la lb ...
高精度計算
一.高精度儲存 1.如對數採用的字串輸入 include include using namespace std const int n 100 最多100位 int main 2.直接讀入 include using namespace std const int n 100 最多100位 int...