当前位置:文档之家› 高精度算法(c语言版)

高精度算法(c语言版)


if(fa*fb<0) printf("-");
for(i = k; i >= 0; i--) printf("%d",c[i]); /*输出结果*/
}
main()
{
int a[250]={0},b[250]={0};
input(a,b);
printf("\n%s+%s=",b1,b2);addition(a,b,0);
高精度算法
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
int an,bn,fa=1,fb=1;
/* 把 an,bn,k 设为全局变量,an 纪录第一个高精度数组的位
数,bn 纪录第二个高精度数组的位数,k 纪录输出结果的位数*/
3、高精度除以高精度(要求用尽可能少的存储单元); 算法:用计算机模拟手算除法,把除法试商转化为连减。 #include <stdio.h> #define N 500 int bj(int a[], int b[], int k1, int k2) /*比较大小函数*/
{
int i, t, flag;
printf("\n 余数 = 0"); exit(1); } 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) { printf("0"); exit(1); } for(i = kk; i >= 0; i--) printf("%d", a[i]); } 4、 N!,要求精确到 P 位(0〈P〈1000〉。 算法:结果用数组 a 保存,开始时 a[0]=1,依次乘以数组中各位,注意进位和数组长度的变 化。源程序如下: #include <stdio.h> #define M 1000 main() { int a[M], i, n, j, flag = 1; printf("n="); scanf("%d",&n); printf("n!="); a[0] = 1; for(i = 1; i < M; i++) a[i] = 0; for(j = 2; j <= n; j++) {
if(k < 0) k = 0;
if(k > 0)
{
for(i = k2 - 1; i >= 0; i--) d[i + k] = d[i]; /*移动减数位数与被减数对齐*/
for(i = 0; i < k; i++) d[i] = 0;
/*移动后的其余位置 0*/
}
for(i = 0; i < k1; i++)
if(a[i] > b[i]) {t = 1; flag = 1;}
else if(a[i] == b[i]) i--;
else {t = 1; flag = 0;}
}
if(i == 0 && t == 0) flag = 2; /*被除数等于除数返回 2*/
}
return flag;
}
int jf(int a[], int b[], int k1, int k2)
for(j = 0; j < kb; j++) {
c[i + j] = c[i + j] + a[i] * b[j]; c[i + j +1] = c[i + j +1] + c[i + j]/10; c[i + j] = c[i + j] % 10; } if(!c[k]) k--; for(i = k-1; i >= 0; i--) printf("%d", c[i]); }
d = 0; for(i = k - 1; i >= 0 ; i--) {
d = d * 10 + a[i]; c[i] = d / b; d = d % b; } while(c[k - 1] == 0 && k > 1) k--; printf("商="); for(i = k - 1; i >= 0; i--) printf("%d", c[i]); printf("\n 余数=%d", d); }
/*flag 作标志位*/
if(k1 < k2)
flag = 0;
/*被除数小于除数返回 0*/
else if(k1 > k2)
flag = 1;
/*被除数大于除数返回 1*/
else
{
/*被除数和除数位数相等则逐位进行比较*/
i = k1;
t = 0;
while(t == 0 && i > 0)
{
int a[N] = {0}, c[N] = {0}; 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';
return;
}
else addition(a,b,1);
}
void multiplication( int a[], int b[])
/*高精度乘法运算*/
{
int i, j, c[501] = {0},k;
k = an + bn - 1;
/*用 k 纪录结果的最大位数*/
for(i = 0; i < an; i++)
/*减法运算*/
{
int i, k, d[N];
for(i = 0; i < k2; i++) d[i] = b[i];
/*把除数赋给数组 d*/
for(i = k2; i < N; i++) d[i] = 0;
/*d 数组无数据的高位置 0*/
k = k1 - k2 - 1;
/*计算减法起始位置*/
转为整数形数据,同样用数组纪录 */ for (i=0; i<bn; i++,bi++) a2[i]=b2[bn-bi]-'0';
/* 同上 */
/*把字符形数据 b1
return;
} void addition(int a[],int b[],int q)
/*高精度加法运算*/
{
int i,c[251]={0},k;
}
c[i]=b[i]-a[i];
} while(!c[k-1]&&k>1) k--;
/*判断最后结果的位数*/
if(q&&(fa>0&&f||fa<0&&!f)||fa>0&&(fb>0&&!f||f&&!q)) /*如果 f 为真是输出负号*/
printf("-");
for(i=k-1;i>=0;i--) printf("%d",c[i]);
{
if(a[i] >= d[i]) a[i] -= d[i];
else
{
a[i + 1] = a[i + 1] - 1;
a[i] = 10 + a[i] - d[i];
}
}
return k;
}
main()
{ int a[N] = {0}, b[N] = {0}, c[N] = {0}, d[N] = {0}; 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; do { while(a[ka - 1] == 0) ka--; t = bj(a, b, ka, kb); if(t >= 1) { k = jf(a, b, ka, kb); c[k]++; if(k > m) m = k; t1 = 0; for(i = k; i <= m; i++) { x = c[i] + t1; c[i] = x % 10; t1 = x / 10; } if(t1 > 0) {m++; c[m] = t1; } } }while(t == 1); if(t2 == 0) { printf("商=0"); printf("\n 余数="); for(i = kd - 1; i >= 0; i--) printf("%d", a[i]); exit(1); } if(t2 == 2) { printf("商 = 1");
相关主题