80个19哪两个数相乘积是80,积的个位是什么

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
小学奥数训练题 乘积的个位数
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
小学奥数训练题 乘积的个位数
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口(window.slotbydup=window.slotbydup || []).push({
id: '1110850',
container: s,
size: '234,60',
display: 'inlay-fix'
您好,请点击下方鈥湽刈⑩EUR澏??以后就可以每天免费收到一次很多人都在找的精彩的文章!记住,是完全免费的,请放心关注!商务合作QQ:
男子耍流氓 大街上偷.,看女生裙.,底
[广告]●●●●●●●●●●●
热门公众号Accounts
?第一推?专注于社会化媒体营销:公众号代运营、微活动策划与推广、公众平台功能开发等服务,?第一推微转化?平台(www.diyitui.com)采用大数据整合运营精准引流助力公众号运营.运营咨询电话:9
aiqingyulu520520
提供各种有关于?爱情?的精美语句在线阅读欣赏;有经典伤感语句;非主流语句;感人浪漫的语句;?爱情?句子等.
参与、沟通、记录时代.
super-lotto
欢迎关注鈥滮√宀食?洞罄滞庚⑩EUR?我们的官方微信有趣、有礼、有用、有范儿.来吧,乐透不止,畅活由你.
《?大河健康报?》官方
qingxuwang
?清徐信息网?(www.qingxu.net)是为山西太原清徐网友提供清徐县及太原周边县区生活类便民信息服务的公益网络平台.
qianjiangwanbao
30年一贯靠谱! 在浙江,新闻快,资讯多,服务全!还能聊情怀、侃八卦!
baishazaixian-com
?白沙在线?:白沙门户.?白沙在线?:为白沙人办、给白沙人看;为白沙建言,助白沙腾飞;关注?白沙在线?,助力白沙发展.海南白沙:是山水白沙、云上白沙、黎苗白沙、活力白沙、美丽白沙、文明白沙,白沙人的美好家园....
?观察者网?,智库与专业新闻媒体的完美结合.
报道多元世界 解读复杂中国
点击下面免费关注我,没有丑女人,只有懒女人,每天学点?穿衣打扮?,让自己做个漂亮女人!
你和美好生活只差一个我,带你感触不受时光侵扰的美丽~?教你练瑜伽?
?博白飞扬在线?是博白主流新媒体,传递百业信息,服务百姓生活.为您展现博白资讯,社会焦点,百姓身边大小事情,是您房产交易、招聘求职、二手买卖、网上交友、优惠购物、户外旅行的好平台. 让您足不出户第一时间了...
数学心算法,极速心算,快点丢掉计算器 很有用!!!
&发表于& 06:38:29
请点击上面蓝色字  免费订阅!2015最火微信号推荐1乘法速算一、乘数的个位与被乘数相加,得数为前积,乘数的个位与被乘数的个位相乘,得数为后积,满十前一。例:15×1715 + 7 = 225 × 7 = 35---------------255即15×17 = 255解释:15×17=15 ×(10 + 7)=15 × 10 + 15 × 7=150 + (10 + 5)× 7=150 + 70 + 5 × 7=(150 + 70)+(5 × 7)为了提高速度,熟练以后可以直接用“15 + 7”,而不用“150 + 70”。例:17 × 1917 + 9 = 267 × 9 = 63即260 + 63 = 323  二、个位是1的两位数相乘方法:十位与十位相乘,得数为前积,十位与十位相加,得数接着写,满十进一,在最后添上1。例:51 × 3150 × 30 = 150050 + 30 = 80------------------1580因为1 × 1 = 1 ,所以后一位一定是1,在得数的后面添上1,即1581。数字“0”在不熟练的时候作为助记符,熟练后就可以不使用了。例:81 × 9180 × 90 = 720080 + 90 = 170------------------7370------------------7371原理大家自己理解就可以了。  三、十位相同个位不同的两位数相乘  被乘数加上乘数个位,和与十位数整数相乘,积作为前积,个位数与个位数相乘作为后积加上去。例:43 × 46(43 + 6)× 40 = 19603 × 6 = 18----------------------1978例:89 × 87(89 + 7)× 80 = 76809 × 7 = 63----------------------7743  四、首位相同,两尾数和等于10的两位数相乘十位数加1,得出的和与十位数相乘,得数为前积,个位数相乘,得数为后积,没有十位用0补。例:56 × 54(5 + 1) × 5 = 30--6 × 4 = 24----------------------3024例: 73 × 77(7 + 1) × 7 = 56--3 × 7 = 21----------------------5621例: 21 × 29(2 + 1) × 2 = 6--1 × 9 = 9----------------------609“--”代表十位和个位,因为两位数的首位相乘得数的后面是两个零,请大家明白,不要忘了,这点是很容易被忽略的。  五、首位相同,尾数和不等于10的两位数相乘 两首位相乘(即求首位的平方),得数作为前积,两尾数的和与首位相乘,得数作为中积,满十进一,两尾数相乘,得数作为后积。例:56 × 585 × 5 = 25--(6 + 8 )× 5 = 7--6 × 8 = 48----------------------3248得数的排序是右对齐,即向个位对齐。这个原则很重要。  六、被乘数首尾相同,乘数首尾和是10的两位数相乘。乘数首位加1,得出的和与被乘数首位相乘,得数为前积,两尾数相乘,得数为后积,没有十位用0补。例:66 × 37(3 + 1)× 6 = 24--6 × 7 = 42----------------------2442例:99 × 19(1 + 1)× 9 = 18--9 × 9 = 81----------------------1881  七、被乘数首尾和是10,乘数首尾相同的两位数相乘与帮助6的方法相似。两首位相乘的积加上乘数的个位数,得数作为前积,两尾数相乘,得数作为后积,没有十位补0。例:46 × 994 × 9 + 9 = 45--6 × 9 = 54-------------------4554  例:82 × 338 × 3 + 3 = 27--2 × 3 = 6-------------------2706  八、两首位和是10,两尾数相同的两位数相乘。两首位相乘,积加上一个尾数,得数作为前积,两尾数相乘(即尾数的平方),得数作为后积,没有十位补0。  例:78 × 387 × 3 + 8 = 29--8 × 8 = 64-------------------2964例:23 × 832 × 8 + 3 = 19--3 × 3 = 9--------------------1909  2平方速算一、求11~19 的平方底数的个位与底数相加,得数为前积,底数的个位乘以个位相乘,得数为后积,满十前一。例:17 × 1717 + 7 = 24-7 × 7 = 49---------------289参阅乘法速算中的“十位是1 的两位相乘”  二、个位是1 的两位数的平方底数的十位乘以十位(即十位的平方),得为前积,底数的十位加十位(即十位乘以2),得数为后积,在个位加1。例:71 × 717 × 7 = 49--7 × 2 = 14------------------5041参阅乘法速算中的“个位数是1的两位数相乘”  三、个位是5 的两位数的平方十位加1 乘以十位,在得数的后面接上25。例:35 × 35(3 + 1)× 3 = 12--25----------------------1225  四、21~50 的两位数的平方在这个范围内有四个数字是个关键,在求25~50之间的两数的平方时,若把它们记住了,就可以很省事了。它们是:21 × 21 = 44122 × 22 = 48423 × 23 = 52924 × 24 = 576求25~50 的两位数的平方,用底数减去25,得数为前积,50减去底数所得的差的平方作为后积,满百进1,没有十位补0。例:37 × 3737 - 25 = 12--(50 - 37)^2 = 169----------------------1369注意:底数减去25后,要记住在得数的后面留两个位置给十位和个位。例:26 × 2626 - 25 = 1--(50-26)^2 = 576-------------------676  3加减法一、补数的概念与应用补数的概念:补数是指从10、100、1000……中减去某一数后所剩下的数。例如10减去9等于1,因此9的补数是1,反过来,1的补数是9。补数的应用:在速算方法中将很常用到补数。例如求两个接近100的数的乘法或除数,将看起来复杂的减法运算转为简单的加法运算等等。4除法速算一、某数除以5、25、125时1、 被除数 ÷ 5= 被除数 ÷ (10 ÷ 2)= 被除数 ÷ 10 × 2= 被除数 × 2 ÷ 10  2、 被除数 ÷ 25= 被除数 × 4 ÷100= 被除数 × 2 × 2 ÷100  3、 被除数 ÷ 125= 被除数 × 8 ÷100= 被除数 × 2 × 2 × 2 ÷100  在加、减、乘、除四则运算中除法是最麻烦的一项,即使使用速算法很多时候也要加上笔算才能更快更准地算出答案。
声明:以上内容转载自微信公众号,并不代表本站观点及立场,且版权归属微信公众号。
微信公众号分析:通过试算可得:8=8,82=64,83=512,84=4096,85=32768,86=262144…,由此可发现,其乘积的个位数每8、4、2、6四个数为一组进行循环.…2,所以&8×8×8×8×…×8之积的个位数字是4.解答:解析:由于:8=8,82=64,83=512,84=4096,85=32768,86=262144…,即其乘积的个位数每8、4、2、6四个数为一组进行循环.…2,所以&8×8×8×8×…×8之积的个位数字与82=64的末尾相同是4.故答案为:4.点评:通过试算得出8的乘方个位数的循环规律是完成本题的关键.
练习册系列答案
科目:小学数学
我国某城市煤气收费规定:每月用量在8立方米或8立方米以下都一律收6.9元,用量超过8立方米的除交6.9元外,超过部分每立方米按一定费用交费,某饭店1月份煤气费是82.26元,8月份煤气费是40.02元,又知道8月份煤气用量相当于1月份的,那么超过8立方米后,每立方米煤气应收多少元?
科目:小学数学
500+320+80=
165-50-50=
273+35+65=
120+395+80=
90÷90×90=
100-23-77=
165+165-165=
65-(40-25)=
800+683-600=
(27+36)÷7=
650-599+250=
989-231+231=
53-(48+5)=
7×8×0×9+9×8=
1+2+3+4+5+6+7+8+9=
81-9-9-9-9-9-9=
15+15+15+15+15+15=
89+89-89+89-89=
64-5×8-2×8=
147+148+149+150+151+152+53=
1+2+3+4+5+6…+94+95+96+97+98+99=
科目:小学数学
来源:专项题
题型:解答题
分别求出下面两组数据的平均数、中位数和众数各是多少?&&&(1)8.8,8.2,8.4,8.5,8.6,8.4,8.1,8.3,8.5,8.6,8.7,8.3&&&&&(2)8.5,8.3,8.4,8.5,8.3,8.4,8.3,8.4,8.5,8.4,8.4,8.4
科目:小学数学
题型:解答题
4.7+2.3=4.5×2=6.9-2.5=7.2×0.8=6×3.4=0.62-0.32=1.4×0.5=0.75×100=0.02×0.5=3.6÷0.3=6.3÷7=5.6÷100=0.75÷0.25=0.125×8=4.8÷0.3=0.96÷2=0.56÷28=0.36÷0.4=0.64÷0.8=0.72÷3.6=3.6÷24=0.8×1.1=7.2+12.8=46.7-3.8=12.8÷4=5.2÷13=12.5÷5=1.64÷41=10÷20=24÷15=8.65×10=0.35×0.6=3.08×0.01=4.95×1000=6.9×0.1=0.4×0.5=2.4÷0.8=10.8÷9=9.6÷0.8=0.108÷2=4.95÷0.9=9.65÷0.1=0.325×100=2.5×8=0.56÷0.7=0.125×4=3.28×0.1=3.9÷0.13=7.2×0.1=0.01×0.1=0.25×0.4=1.6÷0.8=1÷2.5=1.25×0.8=3.2÷0.04=0÷1.7=0.22×102=9.6÷0.8=5×0.24=4.5-0.05=3.9÷0.1316.5÷0.5=5×0.12=24×0.5=4.8×0.5=2.8+4.2=0.84÷2.1=5÷0.25=7.8÷0.01=5.4÷0.6=3.2÷5=7×0.62=0.56÷0.8=7.4-2.8=0.18÷0.2=0.16÷8=4.5×0.02=8+7.2=1.2×30=0.012×0.2=7.3×0.3=9÷6=3.6÷0.12=7.8÷0.6=2÷5=4.5+5=0.3÷0.6=0.96÷0.2=10.5×0.4=7.3+0.27=8×0.125=0.54÷0.6=0.61+0.39=0.56÷28=10÷20=4.08÷0.4=11-9.4=0.8×0.11=0.72+12.8=5.6÷0.01=2.3×100=0.75×100=0.108÷2=10.8÷9=0.7÷0.8=16-5.07=4.2×0.4=0.72×6=12÷0.5=5.2×0.4=12.2÷0.2=5.6÷100=0.41+3.7=0.02×0.5=7.2-0.8=1.4×0.5=84÷0.21=0.75÷0.25=2.5×16=0.108÷2=1.75+32.5=16-5.07=5.2÷13=1.64÷41=1.02×0.2=0.26×0.3=8.4×0.02=1.29×6=0.8×0.05=12.6÷0.03=8.71÷0.1=21÷0.21=0.8×0.13=0.34÷17=8.08÷0.4=0.5×2.2=1.24÷4=3.27+0.63=5.02×0.3=0.3×0.5=6.4÷4=7.2÷1.8=0.7÷0.35=0.72÷1.44=0.48÷0.04=1.25÷2.5=5.5+55=16.8÷8=0.54+2.2=3.5-0.05=2÷0.02=0.25×40=1.5×0.6=0.32÷0.8=12.25÷0.5=73.5×0.1=46.5+52.5=0.45×102=1.25×88=2.64+3.85+1.54=8×1.25=5.6÷3.5=4.2÷0.7÷6=0.4×8.6×25=0.27÷0.3=2.5×101=0.65×101-0.65=2.6×7÷2.6×7=
科目:小学数学
题型:解答题
8×6=72+19=6÷1=180÷180=48÷8=45+37=4×7=550-550=500-370=25+75=55+88==69+24=350-80=77+66=790+130=87-29=800-330=99+11=257-257=65+35=69÷8=92+46=46÷7=50÷6=0÷8=39÷9=93-39=86-68==29+63=54-45=7×7=75÷9=81÷9=800-260=86×0=470-80=55÷7=38+52=250+630=77+33=380+70=500-490=66÷7=6÷6=95-68=0×9=27÷9=910-320=73+37=0÷9=680+220=550+260=25÷4=0+9=57-38=8×9=47÷8=126-126=42+42÷7=64÷8+70=500+320+80=60+60+60=8÷8×8=0=30-30÷6=165-50-50=273+35+65=120+395+80=90÷90×90=0=100-23-77=165+165-165=65-(40-25)=28÷7×6=800+683-600=45+36-45=5×8÷5=(27+36)÷7=650-599+250=58+97-58=989-231+231=53-(48+5)=7×8×0×9+9×8=1+2+3+4+5+6+7+8+9=81-9-9-9-9-9-9=15+15+15+15+15+15=89+89-89+89-89=64-5×8-2×8=147+148+149+150+151+152+53=1+2+3+4+5+6…+94+95+96+97+98+99=
精英家教网新版app上线啦!用app只需扫描书本条形码就能找到作业,家长给孩子检查作业更省心,同学们作业对答案更方便,扫描上方二维码立刻安装!
请输入姓名
请输入手机号题目描述:
输出两个不超过100位的大整数的乘积。
输入两个大整数,如
输出乘积,如:
样例输入:
样例输出:
注意:在oj上不能直接套用我的代码,需要将无关的输出去除才行
解这道题目最简单的方法就是模拟我们笔算乘法的过程,如:
只要把这个过程实现,无论多大的数我们都能解决了,是不是很简单。
程序实现:
首先,我们用两个字符串来保存我们的大整数,num1[100], num2[100]
scanf("%s%s", num1, num2);
然后,求num2的每一位与num1的乘积,保存到tempRes中。
过程为:res保存每位相乘的结果,carry用来保存进位,每位相乘之后还要加上进位才是真的结果。将res的个位保存到tempRes中,其他位则为下一位相乘的进位。
for(j = num2Len - 1; j &= 0; j--)
/*计算num1与num2各位相乘的结果,保存到tempRes中
*每一位相乘后与之前的进位相加得出res,将res的个
*位(res%10)保存到tempRes里,然后将res的其余位数
*(res/10)则为进位carry*/
for(i = num1Len-1; i &= 0; i--)
res = Int(num1[i]) * Int(num2[j]) +
tempRes[tempResLen--] = Char(res % 10);
carry = res / 10;
//tempRes第一位为进位,刚刚的循环是没有算的,最后把进位算上
tempRes[tempResLen] = Char(carry);
tempResLen = num1L
carry = 0;
再然后,将tempRes与result求和,每求一次,向左偏移一位。res为每位之和再加上进位,这里很重要,然后保存到result里只是res的个位,res为下一位计算的进位。
//由result的末尾开始计算和,算完一次,向左偏移一位
for(k = resultLen- k & (resultLen-offset-num1Len); k--)
res = Int(result[k]) + Int(tempRes[tempResLen--]) +
result[k] = Char(res%10);
carry = res/10;
result[k] += Int(tempRes[tempResLen] + carry);
以上两步就是我程序最核心的部分。以下是程序的全部代码。
1 #include&stdio.h&
2 #include&string.h&
3 #include&malloc.h&
5 #define and &&
6 #define or ||
7 #define not !
8 #define Int(X) (X - '0')
9 #define Char(X) (X + '0')
11 char *multiBigInteger(const char *, const char *);
12 int checkNum(const char *);
14 int main(void)
char num1[100] = {'\0'}, num2[100] = {'\0'};
while(scanf("%s%s", num1, num2) != EOF)
char *result = "0";
if(strlen(num1) & 100 or strlen(num2) & 100)
printf("ERROR\n");
if(checkNum(num1) or checkNum(num2))
printf("ERROR: input must be an Integer\n");
printf("num1:\t%s\nnum2:\t%s\n", num1, num2);
result = multiBigInteger(num1, num2);
if(result[0] == '0')
printf("result:\t");
for(i = 1; (size_t)i & strlen(result); i++)
printf("%c", result[i]);
printf("\n");
printf("result:\t%s\n", result);
printf("\n");
51 int checkNum(const char *num)
for(i = 0; (size_t)i & strlen(num); i++)
if(num[i] & '0' or num[i] & '9')
64 char *multiBigInteger(const char *num1, const char *num2)
char *tempRes = NULL;
//用来保存每次相乘的结果
char *result = NULL;
//用来保存最终结果
int tempResL
//每次相乘结果的最大长度
int num1Len = strlen(num1);
//num1的长度
int num2Len = strlen(num2);
//num2的长度
int resultL
//结果的最大长度
//循环计数器
//每次一位相乘/相加的结果
int carry = 0;
int offset = 0;
//加法的偏移位
resultLen = num1Len + num2Len - 1; //结果长度最大为num1长度和num2长度之和,由于下标从0开始,所以要减一
tempResLen = num1L
//每次num1乘以num2每一位的结果最大长度是num1Len+1,由于下标从0开始,所以减一后约去1,只剩num1Len
//初始化result为0
result = (char *)malloc((resultLen+2)*sizeof(char));
memset(result, '0', (resultLen+1)*sizeof(char));
result[resultLen+1] = 0;
tempRes = (char *)malloc((tempResLen+2)*sizeof(char));
for(j = num2Len - 1; j &= 0; j--)
//初始化tempRes每位为0
memset(tempRes, '0', (tempResLen+1)*sizeof(char));
/*计算num1与num2各位相乘的结果,保存到tempRes中
*每一位相乘后与之前的进位相加得出res,将res的个
*位(res%10)保存到tempRes里,然后将res的其余位数
*(res/10)则为进位carry*/
for(i = num1Len-1; i &= 0; i--)
res = Int(num1[i]) * Int(num2[j]) +
tempRes[tempResLen--] = Char(res % 10);
carry = res / 10;
//tempRes第一位为进位,刚刚的循环是没有算的,最后把进位算上
tempRes[tempResLen] = Char(carry);
tempResLen = num1L
carry = 0;
//由result的末尾开始计算和,算完一次,向左偏移一位
for(k = resultLen- k & (resultLen-offset-num1Len); k--)
res = Int(result[k]) + Int(tempRes[tempResLen--]) +
result[k] = Char(res%10);
carry = res/10;
result[k] += Int(tempRes[tempResLen] + carry);
carry = 0;
tempResLen = num1L
printf("num1Len:%d\nnum2Len:%d\n", num1Len, num2Len);
大整数相乘完整代码
以下是程序执行的结果:
看了以上的代码,感觉思路虽然很简单,但是实现起来却很麻烦,那么我们有没有别的方法来实现这个程序呢?答案是有的,接下来我来介绍第二种方法。
简单来说,方法二就是先不算任何的进位,也就是说,将每一位相乘,相加的结果保存到同一个位置,到最后才计算进位。
例如:result[200]用来保存结果,计算98&21,步骤如下
由上面可以看出,result的数据为result[100] = {0, 18, 27, 9}
接下来就处理进位,注意看,巧妙的地方来了:
有result末尾到首位计算:
第一次:result[3] = 9; result[2] = 27;
A.先将result[3]除个位以外的数加给前一位,也就是result[2]:result[2] = result[2]+result[3]/10 = 27 + [9/10]=27; 注:数学里面的[]为取整符。如[0.9] = 0
B.然后把result[3]的个位保存到result[3]:
&& result[3] = result[3]%10 = 9;
第二次,向前一位,result[2] = 27, result[1] = 18;
重复第一次的A、B步骤,求得result[1] = result[1]+result[2] / 10=18+[27/10] = 20;
&& result[2] = result[2] % 10 = 7
第三次,再向前一位,result[1] = 20, result[0] = 0
重复之前的步骤,
&& result[0] = result[0]+result[1]/10=0+[20]/10=2
&& result[1] = result[1] % 10 = 0;
至此,已经算到首位,result此时的结果为:result[100] = {2, 0, 7, 9}可以知道这就是结果:99&21=2079;
核心代码:
先是不进位的各位之和:
for(j = 0; j & num2L j++)
for(i = 0; i & num1L i++)
/* result第一位是用来保存result长度的,而第二位是保存结果最后的进位的
* 没有进位,则result[1]为0,所以每位相乘之和是从第三位(即result[2])
* 开始。这里是本程序的比较巧妙的地方,需要仔细想想。
result[i+j+2] += Int(num1[i]) * Int(num2[j]);
接下来是处理进位的代码:
/* 这个循环用来处理进位的,所以要从result的最后一位一直处理到首位。
* 要注意result的总长度是resultLen+1,有一位是保存result的长度,而
* C语言下标是从0开始,所以result的最后一位的下标就是resultLen,而
* 第一位就是1。*/
for(i = resultL i & 1; i--)
result[i-1] += result[i]/10;
result[i] = result[i]%10;
注意:这个方法有一个大坑,就是保存结果的result的数据类型必须至少是int,而不能是char,为什么呢?先想想再打开答案。
/* 因为char类型的数据每个只有1个字节
* 也就是8位,所以保存的最大数值为256
* 而我们这个程序,每位最大为100个9&9=81
* 之和,也就是每个数据必须最大要能保存的数
* 值为8100, 所以char数据类型就不够保存了。
* good luck :-)*/
接下来程序的完整代码:
1 #include&stdio.h&
2 #include&string.h&
3 #include&malloc.h&
5 #define and &&
/**************/
6 #define or ||
/* python风格 */
7 #define not !
8 #define Int(X) (X - '0') /**************/
10 int *multiBigInteger(const char *, const char *);
11 int checkNum(const char *);
13 int main(void)
char num1[100] = {'\0'}, num2[100] = {'\0'};
printf("Please input two nunber(less than 100 digits):\n& ");
while(scanf("%s%s", num1, num2) != EOF)
int *result = NULL;
int i, change = 0;
//对输入的数据进行检验
if(strlen(num1) & 100 or strlen(num2) & 100)
printf("per number must less than 100 digits\n");
if(checkNum(num1) or checkNum(num2))
printf("ERROR: input must be an Integer\n");
printf("num1:\t%s\nnum2:\t%s\n", num1, num2);
result = multiBigInteger(num1, num2);
/* 输出结果result,result[0]保存着result的长度,
* 所以下标要从1开始 */
printf("result:\t");
for(i = 1; i &= result[0]; i++)
if(result[i] != 0) //这一步用来去掉前导0,第一位为0跳过不输出
change = 1;
if(not change)
//这一步用来判断结果是否为0,
//如果结果第二位还是0,就判断为0
printf("0");
printf("%d", result[i]);
printf("\n");
printf("\nPlease input two nunber(less than 100 digits):\n& ");
62 //用于检测输入的是否是数字,如果是就返回0,不是就返回1
63 int checkNum(const char *num)
for(i = 0; (size_t)i & strlen(num); i++)
if(num[i] & '0' or num[i] & '9')
76 //返回结果result,为一片内存块,类似数组
77 int *multiBigInteger(const char *num1, const char *num2)
int *result = NULL;
//用来保存最终结果
int num1Len = strlen(num1);
//num1的长度
int num2Len = strlen(num2);
//num2的长度
int resultL
//结果的最大长度
//循环计数器
resultLen = num1Len + num2L
//结果长度最大为num1长度和num2长度之和
//初始化result为0
result = (int *)malloc((resultLen+1)*sizeof(int));
memset(result, 0, (resultLen+1)*sizeof(int));
result[0] = resultL //result的第一位是用来保存result的长度的。
/* num1乘以num2,由于这里采用先不进位的算法,所以算法是按从左到右
* 按顺序来乘,然后将每位的结果保存到result的每一位中,循环一次
* reult就从下一位开始求和。如下:(左边为正常算法,右边为本程序算法)
for(j = 0; j & num2L j++)
for(i = 0; i & num1L i++)
/* result第一位是用来保存result长度的,而第二位是保存结果最后的进位的
* 没有进位,则result[1]为0,所以每位相乘之和是从第三位(即result[2])
* 开始。这里是本程序的比较巧妙的地方,需要仔细想想。
result[i+j+2] += Int(num1[i]) * Int(num2[j]);
/* 这个循环用来处理进位的,所以要从result的最后一位一直处理到首位。
* 要注意result的总长度是resultLen+1,有一位是保存result的长度,而
* C语言下标是从0开始,所以result的最后一位的下标就是resultLen,而
* 第一位就是1。*/
for(i = resultL i & 1; i--)
result[i-1] += result[i]/10;
result[i] = result[i]%10;
printf("num1Len:%d\nnum2Len:%d\n", num1Len, num2Len);
大整数相乘2完整代码
程序运行结果:
这是一道非常经典而且必须要掌握的题目,所以看到这篇文章的你最好能认真理解一下。
作者:陈栋权
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,
且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有特别用途,请与我联系邮箱:
最后有兴趣的同学可以关注我的微信公众号,可以随时及时方便看我的文章。*^_^*
扫码关注或者搜索微信号:King_diary&
阅读(...) 评论()

我要回帖

更多关于 时域相乘频域卷积证明 的文章

 

随机推荐