600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > c语言乘法超过长整数 C语言中超大整数乘法运算

c语言乘法超过长整数 C语言中超大整数乘法运算

时间:2021-08-24 17:48:14

相关推荐

c语言乘法超过长整数 C语言中超大整数乘法运算

《C语言中超大整数乘法运算》由会员分享,可在线阅读,更多相关《C语言中超大整数乘法运算(8页珍藏版)》请在人人文库网上搜索。

1、C 语言中超大整数乘法运算在计算机中,长整型 (long int) 变量的范围是 -2147483648 至 2147483647 ,因此若用长整型变量做乘法运算,乘积最多不能超过 10 位数。即便用双精度型 (double) 变量,也仅能保证 16 位有效数字的精度。在某些需要更高精度的乘法运算的场合,需要用别的办法来实现乘法运算。比较容易想到的是做多位数乘法时列竖式进行计算的方法,只要写出模拟这一过程的程序,就能实现任意大整数的乘法运算。经过查阅资料,找到一种更易于编程的方法,即“列表法”。下面先介绍“列表法”:例如当计算 8765 x 234时,把乘数与被乘数照如下列出,见表1 :把表 。

2、1 中的数按图示斜线分组(横纵坐标和相等的数分为一组),把每组数的累加起来所得的和记在表格下方,见表 2 :从最低位的 20 开始,保留个位数字“0 ”,把个位以外的数“2 ”进到前一位;把39次低位的加上低位进上来的2 得 41 ,保留个位数字“1 ”,把“4 ”进到前一位;以此类推,直至最高位的 16 ,16 加上低位进上来的4 得 20 ,保留“0 ”,把2 进到最高位,得乘积答数2051010 。根据以上思路就可以编写C 程序了,再经分析可得:.1、一个 m 位的整数与一个n 位的整数相乘,乘积为m+n-1位或 m+n 位。2、程序中,用三个字符数组分别存储乘数、被乘数与乘积。由第1 。

3、点分析知,存放乘积的字符数组的长度应不小于存放乘数与被乘数的两个数组的长度之和。3、可以把第二步“计算填表”与第三四步“累加进位”放在一起完成,可以节省存储表格2 所需的空间。4、程序关键部分是两层循环,内层循环累计一组数的和,外层循环处理保留的数字与进位。编写的程序如下:#define MAXLENGTH 1000#include #include void compute(char *a, char *b, char *c);void main(void)char aMAXLENGTH, bMAXLENGTH, cMAXLENGTH * 2;puts(Input multiplier :)。

4、;gets(a);puts(Input multiplicand :);gets(b);compute(a, b, c);puts(Answer :);puts(c);getchar();.void compute(char *a, char *b, char *c)int i, j, m, n;long sum, carry;m = strlen(a) - 1;n = strlen(b) - 1;for (i = m; i = 0; i-)ai -= 0;for (i = n; i = 0; i-)bi -= 0;cm + n + 2 = 0;carry = 0;for (i = m + n。

5、; i = 0; i-) /* i为坐标和 */sum = carry;if (j = i - m) #include#include#include#include#define N 7200 /作 72xx 位的整数乘法int max(int,int,int);int initarray(int a);void write(int a,int l);FILE *fp;void main()int a5000=0,b5000=0,k10001=0; /声明存放乘数、被乘数与积的数组clock_t start, end; /声明用于计时的变量unsigned long c,d,e; / 声明作。

6、累加用的无符号长整数变量 int i,j,la,lb,ma,mi,p,q,t; / 声明其它变量 randomize(); / 初始化随机数.la=initarray(a); /产生被乘数,并返回其长度lb=initarray(b); /产生乘数,并返回其长度if(lala)?lb:la;for (q=0;q=0;i-) /累加斜线间的数, i 为横纵坐标之和c=d; /将前一位的进位标志存入累加变量cma=max(0,i-la+1,i-lb+1); /求累加的下限mi=(ila-1)?(la-1):i; /求累加的上限for(j=ma;j999)c%=1000; /取 c 的末三位ki=c;。

7、 /保存至表示乘积的数组ke=k0+1000*d; /求出乘积的最高位end = clock();/停止计时fp = fopen(result.txt, w+); /保存结果到 result.txtprintf(nThe elapsed time was: %3.4fn, (end - start) / CLK_TCK);/ 打印消耗的时间.fprintf(fp,%d,a0); /打印被乘数最高位write(a,la); /打印被乘数其他位fprintf(fp,%d,b0); /打印乘数最高位write(b,lb); /打印乘数其他位fprintf(fp,%ld,e); /打印乘积最高位wri。

8、te(k,la+lb-1); /打印乘积其他位fclose(fp);max(int a,int b,int c)int d;d=(ab)?a:b;return (dc)?d:c;int initarray(int a)int q,p,i;q=N+random(100);if(q%3=0)p=q/3;elsep=q/3+1;for(i=0;ip;i+)ai=random(1000);if(q%3=0)a0=100+random(900);if(q%3=2).a0=10+random(90);if(q%3=1)a0=1+random(9);return p;void write(int a,int l)int i;char string10;for(i=1;il;i+)itoa(ai,string,10);if (strlen(string)=1)fprintf(fp,00);if (strlen(string)=2)fprintf(fp,0);fprintf(fp,%s,string);if(i+1)%25=0)fprintf(fp,n);fprintf(fp,n);fprintf(fp,n);。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。