for (i=0i<lai++)if(a[i]!=b[i]) return a[i]-b[i]
return 0}
参数说明:a,b是除数和被除数 c是商数,d是余数la,lb,lc,ld 分别是a,b,c,d的长度int big_div (char* a, char* b, char* c, char* d, int la, int lb, int lc, int ld) // c = a/bmust lc >= la-lb+1 &&ld >= lb{int i,t,lr char* r memset(c,0,sizeof(char)*lc) //把c数组清成0t = la-lb+1 lr = lb -1 r = d+ld-lr for (i=0i<lri++) r[i] = a[i] while (t>0){for (i=0i<lri++) r[i-1] = r[i] r[lr-1] = a[la-t] lr++r--if (!*r) {r++lr--}int s = 0 while (big_compare(r,b,lr,lb)>=0){s++ big_sub(r,b,lr,lb) if (!*r) {r++lr--}}c[lc-t] = s//cout<<"s = "<<s<<" ."<<endl t-- }
return true}精度计算——加法语法:add(char a[],charb[],char s[])参数: a[]:被乘数,用字符串表示,位数不限 b[]:乘数,用字符串表示,位数不限 t[]:结果,用字符串表示返回值:null注意: 空间复杂度为 o(n^2) 需要 string.h源程序: void add(char a[],char b[],char back[]){int i,j,k,up,x,y,z,lchar *cif (strlen(a)>strlen(b)) l=strlen(a)+2elsel=strlen(b)+2c=(char *) malloc(l*sizeof(char))i=strlen(a)-1j=strlen(b)-1k=0up=0while(i>=0||j>=0){if(i<0) x='0'else x=a[i]if(j<0) y='0'else y=b[j]z=x-'0'+y-'0'if(up) z+=1if(z>9) {up=1z%=10} else up=0c[k++]=z+'0'i--j--}if(up) c[k++]='1'i=0c[k]='\0'for(k-=1k>=0k--)back[i++]=c[k]back[i]='\0'} 精度计算——减法语法sub(char s1[],chars2[],char t[])参数: s1[]:被减数,用字符串表示,位数不限 s2[]:减数,用字符串表示,位数不限 t[]:结果,用字符串表示返回值:null注意: 默认s1>=s2,程序未处理负数情况需要 string.h源程序: void sub(char s1[],chars2[],char t[]){int i,l2,l1,kl2=strlen(s2)l1=strlen(s1)t[l1]='\0'l1--for (i=l2-1i>=0i--,l1--){if (s1[l1]-s2[i]>=0) t[l1]=s1[l1]-s2[i]+'0'else{t[l1]=10+s1[l1]-s2[i]+'0's1[l1-1]=s1[l1-1]-1}}k=l1while(s1[k]<0) {s1[k]+=10s1[k-1]-=1k--}while(l1>=0) {t[l1]=s1[l1]l1--}loop:if (t[0]=='0') {l1=strlen(s1)for (i=0i<l1-1i++) t[i]=t[i+1]t[l1-1]='\0'goto loop}if (strlen(t)==0) { t[0]='0't[1]='\0'}}
精度计算——乘法(大数乘小数)语法:mult(char c[],chart[],int m)参数: c[]:被乘数,用字符串表示,位数不限 t[]:结果,用字符串表示 m:乘数,限定10以内返回值:null 注意: 需要 string.h源程序: void mult(char c[],chart[],int m){int i,l,k,flag,add=0char s[100]l=strlen(c)for (i=0i<li++)s[l-i-1]=c[i]-'0'for (i=0i<li++){k=s[i]*m+addif (k>=10) {s[i]=k%10add=k/10flag=1} else {s[i]=kflag=0add=0}}if (flag) {l=i+1s[i]=add} else l=ifor (i=0i<li++)t[l-1-i]=s[i]+'0't[l]='\0'} 精度计算——乘法(大数乘大数)语法:mult(char a[],charb[],char s[])参数: a[]:被乘数,用字符串表示,位数不限 b[]:乘数,用字符串表示,位数不限 t[]:结果,用字符串表示返回值:null注意:空间复杂度为 o(n^2) 需要 string.h源程序: void mult(char a[],charb[],char s[]){int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0char result[65]alen=strlen(a)blen=strlen(b)for (i=0i<aleni++)for (j=0j<blenj++) res[i][j]=(a[i]-'0')*(b[j]-'0')for (i=alen-1i>=0i--){for (j=blen-1j>=0j--) sum=sum+res[i+blen-j-1][j]result[k]=sum%10k=k+1sum=sum/10}for (i=blen-2i>=0i--){for (j=0j<=ij++) sum=sum+res[i-j][j]result[k]=sum%10k=k+1sum=sum/10}if (sum!=0) {result[k]=sumk=k+1}for (i=0i<ki++) result[i]+='0'for (i=k-1i>=0i--) s[i]=result[k-1-i]s[k]='\0'while(1){if (strlen(s)!=strlen(a)&&s[0]=='0') strcpy(s,s+1)elsebreak}} </p>
最简单的办法是将大数当作字符串进行处理,也就是将大数用10进制字符数组进行表示,
然后模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。但是这样做效率很低,
因为1024位的大数其10进制数字个数就有数百个,对于任何一种运算,都需要在两个有
数百个元素的数组空间上做多重循环,还需要许多额外的空间存放计算的进位退位标志
及中间结果。其优点是算法符合人们的日常习惯,易于理解。
C语言简介:
是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
C语言特点:
1、C语言是一个有结构化程序设计、具有变量作用域递归功能的过程式语言。
2、C语言传递参数均是以值传递,另外也可以传递指针。
3、不同的变量类型可以用结构体组合在一起。
4、只有32个保留字,使变量、函数命名有更多d性。
5、部份的变量类型可以转换,例如整型和字符型变量。
6、通过指针,C语言可以容易的对存储器进行低级控制。
7、预编译处理让C语言的编译更具有d性。
#include"stdio.h"int getlength(char a[]){
int i=0
while(a[i])
i++
return i
}/*返回字符串的长度*/
int chartoint(char a){
return a-48
}/*将字符编程整形*/
void creatarray(char a[],char b[]){
printf("请输入第一个数:")
scanf("%s",a)
printf("请输入第二个数:")
scanf("%s",b)
}/*创建数组*/
void go(char a[],char b[],int s[]){
int alength=getlength(a)
int blength=getlength(b)
int i=alength-1
int j=blength-1
int k/*s数组下标*/
int slength
if(alength>blength)
slength=alength
else
slength=blength
k=slength
while(i>=0&&j>=0)
s[k--]=chartoint(a[i--])+chartoint(b[j--])
while(i>=0)
s[k--]=chartoint(a[i--])
while(j>=0)
s[k--]=chartoint(b[j--])
k=slength
while(k>=2){
if(s[k]>=10){
s[k-1]++
s[k]-=10
}
k--
}
printf("两数之和为:")
if(s[1]>=10){
s[0]=1
s[1]-=10
for(i=0i<=slengthi++)
printf("%d",s[i])
}
else{
for(i=1i<=slengthi++)
printf("%d",s[i])
}
printf("\n")
}
void main(){
char a[1000],b[1000]
int s[1000]
int lab
lab1: creatarray(a,b)
go(a,b,s)
printf("请输入1继续(想退出按其他数字键):")
scanf("%d",&lab)
if(lab==1)
goto lab1
}
//该程序最高可求1000位数的加法运算(更高位数你可相应设置),对于求减法和乘法也就大同小异了,这里不再赘述,你自己模仿修改一下吧
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)