| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1403 人关注过本帖
标题:自己又写了一个大数乘法,请各位指导。
只看楼主 加入收藏
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
收藏
已结贴  问题点数:20 回复次数:4 
自己又写了一个大数乘法,请各位指导。
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

const int Max=100;
int a[Max],b[Max];
int result[Max+1][Max+1];

int main()
{
    string s1,s2;
    cin>>s1>>s2;
    //int column=max(s1.length(),s2.length());//列
    //int row=min(s1.length(),s2.length());//行
   
     if(s1.length()<s2.length())
    {
        string t=s1;
        s1=s2;
        s2=t;
    }
   
    memset(result,0,sizeof(result));//把数组中的元素都清零
    for(int i=s2.length()-1;i>=0;--i)     //模拟乘法运算每位依次相乘
        for(int j=Max-i,l=Max-i;j>Max-s1.length()-i;--j)//l为Max和s2长度之间的距离
            result[i][j]=(s2[i]-'0')*(s1[j-(l-s1.length())-1]-'0');

    //处理进位
    for(int i=0;i<s2.length();++i)   
        for(int j=Max;j>=Max-(s1.length()+s2.length())+1;--j)
        {   
            result[s2.length()][j]+=result[i][j];
            
            if(result[s2.length()][j]/10)//如果不只有一位数,就有进位
            {
                result[s2.length()][j-1]+=result[s2.length()][j]/10;
                result[s2.length()][j]%=10;
            }
        }
   
    for(int i=0;i<Max+1;++i)
        if(result[s2.length()][i]==0)
            continue;
        else
            cout<<result[s2.length()][i];
    cout<<endl;

    return 0;
}
搜索更多相关主题的帖子: int Max result length for 
2018-05-30 20:34
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
收藏
得分:20 
undefined
以下是引用花脸在2018-5-30 20:34:03的发言:

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

const int Max=100;
int a[Max],b[Max];
int result[Max+1][Max+1];

int main()
{
    string s1,s2;
    cin>>s1>>s2;
    //int column=max(s1.length(),s2.length());//列  
    //int row=min(s1.length(),s2.length());//行
   
     if(s1.length()<s2.length())
    {
        string t=s1;
        s1=s2;
        s2=t;
    }
   //没必要交换
    memset(result,0,sizeof(result));//把数组中的元素都清零
    for(int i=s2.length()-1;i>=0;--i)     //模拟乘法运算每位依次相乘
        for(int j=Max-i,l=Max-i;j>Max-s1.length()-i;--j)//l为Max和s2长度之间的距离
            result[j]=(s2-'0')*(s1[j-(l-s1.length())-1]-'0');
//i大于Max咋办?字符串先转化int数组,一个int可以容纳几位要考虑清楚
    //处理进位
    for(int i=0;i<s2.length();++i)   
        for(int j=Max;j>=Max-(s1.length()+s2.length())+1;--j)
        {   
            result[s2.length()][j]+=result[j];
            
            if(result[s2.length()][j]/10)//如果不只有一位数,就有进位
            {
                result[s2.length()][j-1]+=result[s2.length()][j]/10;
                result[s2.length()][j]%=10;
            }
        }
   
    for(int i=0;i<Max+1;++i)
        if(result[s2.length()]==0)
            continue;
        else
            cout<<result[s2.length()];
    cout<<endl;

    return 0;
}
要注意模块化,一个功能一个函数。
2018-05-30 21:26
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 2楼 童生
i的值不会大于Max的值,Max我这只是随便定义的 测试数据用的,i的值是输入的数的有效的长度。
如果两个大数为le1000,则乘机最大位数是le(1000+1000);,也就是长度两千的说数组。Max=2000即可。
2018-05-30 21:56
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
收藏
得分:0 
以下是引用花脸在2018-5-30 21:56:57的发言:

i的值不会大于Max的值,Max我这只是随便定义的 测试数据用的,i的值是输入的数的有效的长度。
如果两个大数为le1000,则乘机最大位数是le(1000+1000);,也就是长度两千的说数组。Max=2000即可。

你明白,但没处理
2018-05-30 22:23
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 4楼 童生
2018-05-30 23:54
快速回复:自己又写了一个大数乘法,请各位指导。
数据加载中...
 
   



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

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