大数乘法(C说话实现)
实现进程说明: 我们回想一下,在我们小时辰刚打仗多位数的乘法,我们的数学先生会教给我们一个要领,那就是“乘法的竖式计较”。在这里我们就回收该头脑办理大数乘法的题目。???????? 以下是我们常常举办乘法的竖式运算: 按照以上的竖式运算,我们实现进程总结如下: 1、先行使两个字符数组生涯两个大数据; 2、用第一个数据的个位与第二个数据的全部位相乘,并将每一位的运算功效生涯在暂存字符数组temp中,并举办进位调解,即假如该位的数值大于9,就将该数值的十位加到前一位,并将该位的个位生涯在原位。 3、将temp与功效数组rst中的数值逆序相加,也就是从两个数组的倒数第一位开始相加。 4、以沟通的要领,计较出第一个数据的十位与第二个数据相乘的功效,并生涯至temp中。 5、将temp与rst倒数第二位的功效开始逆序相加。 6、第一个数据有几位就将以上进程举办屡次。 注:对付确定每次与rst的倒数第几位相加时,可以回收一个bit变量存下正在举办第一个数据的第几位数据的运算,在最终相加时,在rst数组的末端减去bit就是,应该与temp最后一位相加的位数。 C说话实现进程: OK!?我们可以带着对这个乘法竖式的从头领略来办理我们的大数乘法题目,以下是C说话实现的代码: #include?<stdio.h> #include?<stdlib.h> #include?<string.h> #define?MAXLEN?(100) #define?RSTMAX?(1000000) int?main(int?ac,?char?**av)???????????????????????????????????????????????????????????????????????????????????? { ????char?Mp1[MAXLEN]?=?{0},?Mp2[MAXLEN]?=?{0};? ????char?temp[MAXLEN?+?3]?=?{0},?rst[RSTMAX]?=?{0}; ????int??i?=?0,?j?=?0,?t?=?0,?s?=?0; ????int??len1?=?0,?len2?=?0; ????int??bit?=?0; ????printf("=============?Welcome?to?Mutip?Calculate?============n"); ????printf("Please?enter?two?number?you?want?to?calculate?:?n"); ????scanf("%s%s",?Mp1,?Mp2); ????len1?=?strlen(Mp1); ????len2?=?strlen(Mp2); ????for(j?=?len2?-?1;?j?>=0;?--j){ ???????for(i?=?len1?-?1,?t?=?len1;?i?>=?0;?--i,?--t){ ???????????//?let?two?number?not?two?character?to?multiply ???????????temp[t]?=?(Mp1[i]?-?0x30)?*?(Mp2[j]?-?0x30);? ???????????//?0x30?==?48?==?'0' ???????}???????? ???????? ???????//?adjust?temp's?each?bit?number?which?more?than?9?to?between?0?to?9 ???????for(t?=?len1;?t?>0;?--t){ ???????????if(temp[t]?>?9){ ???????????????temp[t-1]?+=?temp[t]/10; ???????????????temp[t]?%=?10; ???????????} ???????} ???????//?sum?the?new?result?to?the?original?result;???????? ???????for(s?=?len1?+?len2?-?bit,?t?=?len1;?t?>=?0;?--s,?--t){ ???????????rst[s]?+=?temp[t]; ???????} ???????//?ajust?the?new?result?which?more?than?9??????????????????????????????????????????????????????????????????????????????????? ???????for(s?=?len1?+?len2;?s?>?0;?--s){ ????????????if(rst[s]?>?9){ ????????????????rst[s-1]?+=?rst[s]/10; ????????????????rst[s]?%=?10; ????????????} ????????} ????????//?bzero?the?temp?array ????????for(t?=?len1;?t?>=?0;?--t){ ????????????temp[t]?=?0; ????????} ????????bit++; ????} ???? ????//?in?order?to?narmal?output?the?result?as?a?string?not?a?interge ????rst[len1?+?len2?+?1]?=?' '; ???? ????//?switch?rst's?each?bit?to?character?save?into?the?result?array. ????for(s?=?0;?s?<=?len1?+?len2;?++s){ ????????rst[s]?+=?0x30; ????} ????//?delete?the?first?zero?before?output?the?result.???? ????for(s?=?0;?s?<?len1?+?len2;?++s){ ????????if(0x30?==?rst[0]){ ????????????for(t?=?0;?t?<=?len1?+?len2?-?s;?++t){ ????????????????rst[t]?=?rst[t+1]; ????????????}??? ????????}else{ ????????????break; ????????} ????} ????//?output?the?result; ????printf("%s?*?%s?=?%sn",?Mp2,?rst); ????printf("==========?Bye?Bye?==========n"); ????return?0; } ? 运行功效如下: [root@anna-laptop?C]#?./Multip? =============?Welcome?to?Mutip?Calculate?============ Please?enter?two?number?you?want?to?calculate?:? 123456789 987654321 123456789?*?987654321?=?121932631112635269 ==========?Bye?Bye?========== (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |