| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2019 人关注过本帖
标题:大数的乘法
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
回复 9楼 小烧饼
数组也可以~可以参考网上代码~我的那个是顺便拿这题来巩固最近自学数据结构的~原题主代码主要问题是n*=10上面会造成数据溢出~大位数乘法处理位数移位是个难点~个人感觉用数组虽然较容易实现~但现实生活中运算较难理解~一般思维是从右往左算~但获取数组位置比较困难~如果从左往右算~则进位要从该位从右往左用循环遍历~效率不高~所以看上去用栈和队列实现比较复杂~但这样避免了获取数组相对位置的难题~更接近常规乘法笔算思想~当然~网上还有效率更高的分治算法~有能力的可以去参考一下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-14 10:23
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 11楼 九转星河
PS:上楼的说法更正一下~感觉如果用数组做~数组可以从最右端开始算起~这样应该可以解决数组位置问题~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-14 10:33
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 9楼 小烧饼
还是忍不住再说说~其实面向对象的时候这个程序可以不完全理解执行原理~只需要理解各函数的大概功能就行了~至于该函数如何实现该功能可以不管~这个可以叫做"封装"~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-14 10:43
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10611
专家分:43210
注 册:2014-5-20
收藏
得分:0 
以下是引用小烧饼在2017-3-13 18:09:52的发言:

输入的数过大就不行啦

多大的数就不行?
2017-03-14 10:52
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:0 
可以参考这个帖子,传送门:
[url]https://bbs.bccn.net/viewthread.php?tid=470225&page=1#pid2594310[/url]

未佩好剑,转身便已是江湖
2017-03-14 13:01
小烧饼
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2016-12-17
收藏
得分:0 
回复 14楼 吹水佬
感觉过了20位就不行了
2017-03-14 20:58
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10611
专家分:43210
注 册:2014-5-20
收藏
得分:10 
以下是引用小烧饼在2017-3-14 20:58:43的发言:

感觉过了20位就不行了

试试这样行不:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLEN  256

main()
{
    char num1[MAXLEN], num2[MAXLEN];
    gets(num1);
    gets(num2);
    if (*num1==0||*num2==0||*num1=='0'||*num2=='0')
        return;
    int num1Len = strlen(num1);
    int num2Len = strlen(num2);
    char *result = (char*)calloc(num1Len+num2Len+1, sizeof(char));
    int i, j;
    for (i=num1Len-1; i>=0; i--)
    {
        for (j=num2Len-1; j>=0; j--)
        {
            result[i+j+1] += (num1[i]-'0') * (num2[j]-'0');
            if (result[i+j+1] > 9)
            {
                result[i+j] += result[i+j+1]/10;
                result[i+j+1] %= 10;
            }
        }
    }
    for (i=0; i<num1Len+num2Len; i++)
        result[i] += '0';
    printf("%s * %s = %s", num1, num2, *result=='0'?result+1:result);
    free(result);
}
2017-03-14 22:04
快速回复:大数的乘法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023159 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved