c语言大数运算函数库 c语言实现大数乘法

求c语言大数运算代码

精度计算——除法(C++的,跟C很类似)char big_compare (char* a, char* b, int la, int lb) //除法辅助函数{ int i; if (la!=lb) return la-lb;

创新互联建站为客户提供专业的网站设计、成都做网站、程序、域名、空间一条龙服务,提供基于WEB的系统开发. 服务项目涵盖了网页设计、网站程序开发、WEB系统开发、微信二次开发、成都手机网站制作等网站方面业务。

for (i=0;ila;i++) 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/b; must lc = la-lb+1 ld = lb{ int i,t,lr; char* r; memset(c,0,sizeof(char)*lc); //把c数组清成0 t = la-lb+1; lr = lb -1; r = d+ld-lr; for (i=0;ilr;i++) r[i] = a[i]; while (t0) { for (i=0;ilr;i++) 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,l;char *c;if (strlen(a)strlen(b)) l=strlen(a)+2; elsel=strlen(b)+2;c=(char *) malloc(l*sizeof(char));i=strlen(a)-1;j=strlen(b)-1;k=0;up=0;while(i=0||j=0){if(i0) x='0'; else x=a[i];if(j0) y='0'; else y=b[j];z=x-'0'+y-'0';if(up) z+=1;if(z9) {up=1;z%=10;} else up=0;c[k++]=z+'0';i--;j--;}if(up) c[k++]='1';i=0;c[k]='\0';for(k-=1;k=0;k--)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,k;l2=strlen(s2);l1=strlen(s1);t[l1]='\0';l1--;for (i=l2-1;i=0;i--,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=l1;while(s1[k]0) {s1[k]+=10;s1[k-1]-=1;k--;}while(l1=0) {t[l1]=s1[l1];l1--;}loop:if (t[0]=='0') {l1=strlen(s1);for (i=0;il1-1;i++) 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=0;char s[100];l=strlen(c);for (i=0;il;i++)s[l-i-1]=c[i]-'0'; for (i=0;il;i++){k=s[i]*m+add;if (k=10) {s[i]=k%10;add=k/10;flag=1;} else {s[i]=k;flag=0;add=0;}}if (flag) {l=i+1;s[i]=add;} else l=i;for (i=0;il;i++)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=0;char result[65];alen=strlen(a);blen=strlen(b); for (i=0;ialen;i++)for (j=0;jblen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0');for (i=alen-1;i=0;i--){for (j=blen-1;j=0;j--) sum=sum+res[i+blen-j-1][j];result[k]=sum%10;k=k+1;sum=sum/10;}for (i=blen-2;i=0;i--){for (j=0;j=i;j++) sum=sum+res[i-j][j];result[k]=sum%10;k=k+1;sum=sum/10;}if (sum!=0) {result[k]=sum;k=k+1;}for (i=0;ik;i++) result[i]+='0';for (i=k-1;i=0;i--) 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

c语言中对较大数字的处理?

大数处理一般就两种方式,一种是整型的方式,保存绝对准确值 在不出现溢出时,运算结果完全准确。当范围超过最大整型范围时,就需要用数组了

另外一种就是浮点数的方式,通过保存底数和指数的方式,以一定精度表示近似值。

也就是说,如果要绝对准确,那就必须占用更多空间

快速大数可以参考gnu的gmp库

c语言常用库函数有哪些

最低0.27元/天开通百度文库会员,可在文库查看完整内容

原发布者:shimingtime

附录CC语言常用的库函数库函数并不是C语言的一部分,它是由编译系统根据一般用户的需要编制并提供给用户使用的一组程序。每一种C编译系统都提供了一批库函数,不同的编译系统所提供的库函数的数目和函数名以及函数功能是不完全相同的。ANSIC标准提出了一批建议提供的标准库函数。它包括了目前多数C编译系统所提供的库函数,但也有一些是某些C编译系统未曾实现的。考虑到通用性,本附录列出ANSIC建议的常用库函数。由于C库函数的种类和数目很多,例如还有屏幕和图形函数、时间日期函数、与系统有关的函数等,每一类函数又包括各种功能的函数,限于篇幅,本附录不能全部介绍,只从教学需要的角度列出最基本的。读者在编写C程序时可根据需要,查阅有关系统的函数使用手册。1.数学函数使用数学函数时,应该在源文件中使用预编译命令:#include或#include"math.h"2.字符函数在使e68a84e8a2ade799bee5baa631333433623761用字符函数时,应该在源文件中使用预编译命令:#include或#include"ctype.h"3.字符串函数使用字符串中函数时,应该在源文件中使用预编译命令:#include或#include"string.h"4.输入输出函数在使用输入输出函数时,应该在源文件中使用预编译命令:#include或#include"stdio.h"5.动态存储分配函数在使用动态存储分配函数时,应该在源文件中使用预编译命令:#include或#include"stdlib.h"6.其他函数有些函数由于不便归入某一类,所以单独列出。使用这些

常用的C/C++语言大数运算软件包有哪些?

为了解决大数运算的问题,世界各国的软件开发人员和研究学者都进行了很多的研究和实践。近年来,越来越多的开发人员开始重视软件工程的作用,为了减少重复劳动,提高软件的质量和代码复用,许多优秀的大数运算库随之出现。下面对几种优秀的大数库进行简单的介绍:

GMP:GMP大数库是GNU项目的一部分,诞生于1991年。作为一个任意精度的大整数运算库,它包括了任意精度的带符号整数、有理数、浮点数的各种基本运算操作。它是一个c语言的库,但是官方提供了c++的包装类,主要的应用方向是密码学、网络安全、代数系统、计算科学等。GMP库的运行速度非常快的,它的官方网站上称自己为地球上最快的大数库,但是GMP库所提供的只是数学运算功能,并没有密码学相关的高级功能。

Miracl:Miracl库是Shamus Software Ltd开发的一个大数库,它的使用许可针对教育科学研究或者非商业目的地应用是免费的。在应用上它是一个c语言的库,同时提供了几个较为简单的c++包装类。在功能上它不但提供了高精度的大整数和分数的各种数学运算操作而且提供了很多密码学算法中的功能模块,如SHA、AES、DSA等中的一些底层操作。最为特别的是它还提供了很多椭圆曲线密码体制中的底层功能模块。由于Miracl库的内部实现采用了很多的汇编层的代码,故运行速度也非常快。

Crypto++:Crypto++库是一个开源项目,也是免费使用的。由于它是一个纯c++实现的库,所以应用非常的方便,库的结构清晰,使用方便,文档也很健全。Crypto++库提供了很多密码学算法的实现。

OpenSSL:OpenSSL是一个开放源代码的实现了SSL及相关加密技术的软件包,由加拿大的Eric Yang等发起编写的。它可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字等。 它的主要用途并不是大数库,而是SSL协议的实现和应用,但是其中也有一些关于大整数的功能,此外它也是基于c语言。


本文名称:c语言大数运算函数库 c语言实现大数乘法
标题链接:http://pwwzsj.com/article/dogchoe.html