24小时热门版块排行榜    

查看: 2067  |  回复: 18
本帖产生 2 个 程序强帖 ,点击这里进行查看

青涩草

铜虫 (小有名气)


[交流] 【求助】那位达人给我个大数相乘的算法吧 谢谢了

看了一个大数相乘的算法,运行了一下,但是不对,想看看高手的代码,先谢啦
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)


★
青涩草(金币+1):谢谢参与
贴出来让大家看看哪里不对,嗯...话说大数乘法不难啊,就跟手工算竖式乘法差不多
3楼2011-04-02 17:02:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

goldapplepie

至尊木虫 (正式写手)


★
青涩草(金币+1):谢谢参与
引用回帖:
Originally posted by 青涩草 at 2011-04-02 16:40:53:
看了一个大数相乘的算法,运行了一下,但是不对,想看看高手的代码,先谢啦

拿出来改吧。
8楼2011-04-02 21:05:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

青涩草

铜虫 (小有名气)


引用回帖:
Originally posted by 青涩草 at 2011-04-02 16:40:53:
看了一个大数相乘的算法,运行了一下,但是不对,想看看高手的代码,先谢啦

#include
#include
using namespace std;
int *multi(int *num1,int size1,int *num2,int size2)
{//返回位数为size1+size2
      int size=size1+size2;
      int *ret=new int [size];
      int i=0;
      memset(ret,0,sizeof(int)*size);
      for(i=0;i       {
                          int k=i;
                          for(int j=0;j                           {
                                  ret[k++]+=num2*num1[j];
                          }
      }
      for(i=0;i       {
                         if(ret>=10)
                         {
                                       ret[i+1]+=ret/10;
                                       ret=ret%10;
                         }
      }
      return ret;
}
int main()
{
    /*int m,n,num1[100],num2[100];
    cout<<"输入第一个数的位数"<     cin>>m;
    cout<<"输入第一个数"<     for(int i=0;i     {
            cin>>num1;
    }
    cout<<"输入第二个数位数"<     cin>>n;
    cout<<"输入第二个数"<     for(int i=0;i     {
            cin>>num2;
    } */
    int num1[]={3,2};
    int num2[]={1,1};
    int *ret=multi(num1,2 ,num2,2 );
    for(int i=3 ;i>=0;i--)
    {
            cout<;
    }
    delete [] ret;//内存释放
    cin.get();
    return 0;
}
这是那个代码 去上课了 现在才回复  不好意思啊 我试了那两个 是反着的
而且也不太懂 想看看高手的易读些的代码  谢谢
9楼2011-04-02 21:16:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

青涩草

铜虫 (小有名气)


引用回帖:
Originally posted by sudo at 2011-04-02 17:02:13:
贴出来让大家看看哪里不对,嗯...话说大数乘法不难啊,就跟手工算竖式乘法差不多

#include
#include
using namespace std;
int *multi(int *num1,int size1,int *num2,int size2)
{//返回位数为size1+size2
      int size=size1+size2;
      int *ret=new int [size];
      int i=0;
      memset(ret,0,sizeof(int)*size);
      for(i=0;i       {
                          int k=i;
                          for(int j=0;j                           {
                                  ret[k++]+=num2*num1[j];
                          }
      }
      for(i=0;i       {
                         if(ret>=10)
                         {
                                       ret[i+1]+=ret/10;
                                       ret=ret%10;
                         }
      }
      return ret;
}
int main()
{
    /*int m,n,num1[100],num2[100];
    cout<<"输入第一个数的位数"<     cin>>m;
    cout<<"输入第一个数"<     for(int i=0;i     {
            cin>>num1;
    }
    cout<<"输入第二个数位数"<     cin>>n;
    cout<<"输入第二个数"<     for(int i=0;i     {
            cin>>num2;
    } */
    int num1[]={3,2};
    int num2[]={1,1};
    int *ret=multi(num1,2 ,num2,2 );
    for(int i=3 ;i>=0;i--)
    {
            cout<     }
    delete [] ret;//内存释放
    cin.get();
    return 0;
}
这是那个代码 去上课了 现在才回复  不好意思啊 我试了那两个 是反着的
而且也不太懂 想看看高手的易读些的代码  谢谢
10楼2011-04-02 21:16:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

青涩草

铜虫 (小有名气)


引用回帖:
Originally posted by sudo at 2011-04-02 17:02:13:
贴出来让大家看看哪里不对,嗯...话说大数乘法不难啊,就跟手工算竖式乘法差不多

#include
#include
using namespace std;
int *multi(int *num1,int size1,int *num2,int size2)
{//返回位数为size1+size2
      int size=size1+size2;
      int *ret=new int [size];
      int i=0;
      memset(ret,0,sizeof(int)*size);
      for(i=0;i       {
                          int k=i;
                          for(int j=0;j                           {
                                  ret[k++]+=num2*num1[j];
                          }
      }
      for(i=0;i       {
                         if(ret>=10)
                         {
                                       ret[i+1]+=ret/10;
                                       ret=ret%10;
                         }
      }
      return ret;
}
int main()
{
    /*int m,n,num1[100],num2[100];
    cout<<"输入第一个数的位数"<     cin>>m;
    cout<<"输入第一个数"<     for(int i=0;i     {
            cin>>num1;
    }
    cout<<"输入第二个数位数"<     cin>>n;
    cout<<"输入第二个数"<     for(int i=0;i     {
            cin>>num2;
    } */
    int num1[]={3,2};
    int num2[]={1,1};
    int *ret=multi(num1,2 ,num2,2 );
    for(int i=3 ;i>=0;i--)
    {
            cout<     }
    delete [] ret;//内存释放
    cin.get();
    return 0;
}
这是那个代码 去上课了 现在才回复  不好意思啊 我试了那两个 是反着的
而且也不太懂 想看看高手的易读些的代码  谢谢
11楼2011-04-02 21:17:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

青涩草

铜虫 (小有名气)


引用回帖:
Originally posted by goldapplepie at 2011-04-02 21:05:56:
拿出来改吧。

#include
#include
using namespace std;
int *multi(int *num1,int size1,int *num2,int size2)
{//返回位数为size1+size2
      int size=size1+size2;
      int *ret=new int [size];
      int i=0;
      memset(ret,0,sizeof(int)*size);
      for(i=0;i       {
                          int k=i;
                          for(int j=0;j                           {
                                  ret[k++]+=num2*num1[j];
                          }
      }
      for(i=0;i       {
                         if(ret>=10)
                         {
                                       ret[i+1]+=ret/10;
                                       ret=ret%10;
                         }
      }
      return ret;
}
int main()
{
    /*int m,n,num1[100],num2[100];
    cout<<"输入第一个数的位数"<     cin>>m;
    cout<<"输入第一个数"<     for(int i=0;i     {
            cin>>num1;
    }
    cout<<"输入第二个数位数"<     cin>>n;
    cout<<"输入第二个数"<     for(int i=0;i     {
            cin>>num2;
    } */
    int num1[]={3,2};
    int num2[]={1,1};
    int *ret=multi(num1,2 ,num2,2 );
    for(int i=3 ;i>=0;i--)
    {
            cout<     }
    delete [] ret;//内存释放
    cin.get();
    return 0;
}
这是那个代码 去上课了 现在才回复  不好意思啊 我试了那两个 是反着的
而且也不太懂 想看看高手的易读些的代码  谢谢
12楼2011-04-02 21:18:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)


★ ★
微尘、梦想(金币+2): 谢谢回复…… 2011-04-03 17:57:12
青涩草(金币+10): 谢谢 2011-04-04 13:14:13
余泽成(程序强帖+1): 2011-05-13 21:22:56
其实这个程序已经写得比较清晰了...

修改了一下,还有一些小BUG,楼主自己解决吧
CODE:
#include
#include
#include

using namespace std;

int *multi(int *num1,int size1,int *num2,int size2)
{//返回位数为size1+size2
      int size=size1+size2;
      int *ret=new int [size];
      int i=0;
      memset(ret, 0, sizeof(int)*size);
      for(i=0;i       {
                          int k=i;
                          for(int j=0;j                           {
                                  ret[k++] += num2[i]*num1[j];
                          }
      }
      for(i=0;i       {
                         if(ret[i]>=10)
                         {
                                       ret[i+1] += ret[i]/10;
                                       ret[i] = ret[i]%10;
                         }
      }
      return ret;
}
int main()
{
    int num1[]={3,2,1};
    int num2[]={1,1,9,1,3,4};

    int size1=sizeof(num1)/sizeof(num1[0]);
    int size2=sizeof(num2)/sizeof(num2[0]);

    int *ret=multi(num1, size1, num2, size2);
    for(int i=size1+size2-1; i>=0; i--)
    {
            cout<     }

    delete [] ret;//内存释放
    return 0;
}

123*431911=53125053
14楼2011-04-03 10:57:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhengyangg

木虫 (初入文坛)


★ ★ ★ ★
青涩草(金币+1):谢谢参与
余泽成(金币+3, 程序强帖+1): 谢谢参与应助! 2011-05-13 21:23:05
#include
#define N 10000
void main()
{
int a[N],n,k,i,j,m,flag=1;//flag代表位数
printf("请输入一个100以内的正数";
scanf("%d",&n);
for(i=1;i<=N;i++)
  a=0;//这个循环使得数组里的每一个元素初值都为0
a[1]=1;//为了便于累乘运算,特殊的将a[1]赋值为1
    for(k=1;k<=n;k++)//大循环用于计算小于n的所有的数
{
  flag=1;
  for(i=1;i<=k;i++)
  {
   for(j=1;j<=flag;j++)
    a[j]*=i;
   for(j=1;j<=flag;j++)
   {
    if(a[j]>9)//从低位到高位判断是否大于9,如果大于,则进位
    {
     for(m=1;m<=flag;m++)
     {
      if(a[flag]>9)
       flag++;//控制所求得的数的阶乘的位数
      a[m+1]+=a[m]/10;
      a[m]=a[m]%10;//将数字分离到每一个数组元素里
     }
    }
   }
   
  }
  printf("%d的阶乘的全部有效数字为",k);
  for(;flag>=1;flag--)
      printf("%d",a[flag]);//从高位往低位依次输出
  printf("\n\n";
  for(i=1;i<=N;i++)
      a=0;
     a[1]=1;//每次运行以上步骤时都会改变数组a中的值,须再次赋值
}
}
16楼2011-05-12 20:36:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)


★
小木虫(金币+0.5):给个红包,谢谢回帖
引用回帖:
Originally posted by sudo at 2011-04-02 17:02:13:
贴出来让大家看看哪里不对,嗯...话说大数乘法不难啊,就跟手工算竖式乘法差不多

借问下,目前有没有听说过啥算法可以把任意精度的整数从10进制转换到2进制的?想来想去都觉得不太可能,又特别想知道究竟可不可能~
17楼2011-05-12 21:34:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)


★
小木虫(金币+0.5):给个红包,谢谢回帖
引用回帖:
Originally posted by huycwork at 2011-05-12 21:34:38:
借问下,目前有没有听说过啥算法可以把任意精度的整数从10进制转换到2进制的?想来想去都觉得不太可能,又特别想知道究竟可不可能~

这当然是可能的啦

手工是怎么把十进制转换为二进制的,程序模仿这个过程就可以了~~
18楼2011-05-13 08:36:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)


★
小木虫(金币+0.5):给个红包,谢谢回帖
引用回帖:
Originally posted by sudo at 2011-05-13 08:36:52:
这当然是可能的啦

手工是怎么把十进制转换为二进制的,程序模仿这个过程就可以了~~

手算算得手酸~
求高级算法~力求,为计算机减负,解放计算机的运算效率,充分发挥计算潜能,使计算机成为真正的计算机,计算机中的战斗机!
19楼2011-05-13 09:00:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
简单回复
2011-04-02 17:00   回复  
青涩草(金币+1):谢谢参与
2011-04-02 17:19   回复  
青涩草(金币+1):谢谢参与
daijiash5楼
2011-04-02 20:36   回复  
青涩草(金币+1):谢谢参与
太阳谷6楼
2011-04-02 20:37   回复  
青涩草(金币+1):谢谢参与
祝福!
xlli1217楼
2011-04-02 20:51   回复  
青涩草(金币+1):谢谢参与
lipearpear13楼
2011-04-02 21:24   回复  
青涩草(金币+1):谢谢参与
tangyanxmc15楼
2011-04-03 11:14   回复  
青涩草(金币+1):谢谢参与
祝福
相关版块跳转 我要订阅楼主 青涩草 的主题更新
普通表情 龙 兔 虎 猫 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[文学芳草园] 厉娜 +3 张丹枫1991 2026-11-09 5/250 2026-11-09 16:53 by 张丹枫1991
[考博] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +5 kvewwGtKktqB 2026-11-04 12/600 2026-11-09 13:26 by Equinoxhua
[考研] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +5 ttH3f1oA6ace 2026-11-04 15/750 2026-11-09 13:19 by Equinoxhua
[考研] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +6 5sJFDKp2kwuI 2026-11-06 14/700 2026-11-09 11:52 by GwrQVVR6Oenx
[考博] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +5 5sJFDKp2kwuI 2026-11-06 15/750 2026-11-09 11:41 by GwrQVVR6Oenx
[硕博家园] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +4 5sJFDKp2kwuI 2026-11-06 10/500 2026-11-09 08:00 by IhnEQauGmT3K
[考研] 售SCI一区T0P文章,我:8O.55.1.O.54,科目全,可伽急 +3 5sJFDKp2kwuI 2026-11-06 12/600 2026-11-09 06:32 by l48hFd8Nwae2
[公派出国] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +4 5sJFDKp2kwuI 2026-11-06 8/400 2026-11-09 00:14 by l48hFd8Nwae2
[教师之家] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +4 5sJFDKp2kwuI 2026-11-06 8/400 2026-11-08 23:01 by l48hFd8Nwae2
[教师之家] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +5 5sJFDKp2kwuI 2026-11-06 9/450 2026-11-08 22:46 by l48hFd8Nwae2
[教师之家] 延安大学回应“副教授留绝笔信”:确已离世,正核实举报内容 +3 yexuqing 2026-11-04 5/250 2026-11-07 13:22 by 苏东坡二世
[公派出国] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +5 ttH3f1oA6ace 2026-11-04 10/500 2026-11-06 16:12 by 5sJFDKp2kwuI
[公派出国] 售SCI一区文章,我:8.O.551.O.5.4,科目全,可伽急 +6 ttH3f1oA6ace 2026-11-04 12/600 2026-11-06 16:10 by 5sJFDKp2kwuI
[硕博家园] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +4 ttH3f1oA6ace 2026-11-04 11/550 2026-11-06 16:10 by 5sJFDKp2kwuI
[公派出国] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +5 kvewwGtKktqB 2026-11-04 14/700 2026-11-06 05:10 by qL1cU46YIdK0
[硕博家园] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +6 kvewwGtKktqB 2026-11-04 16/800 2026-11-06 05:00 by qL1cU46YIdK0
[考博] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +4 ttH3f1oA6ace 2026-11-04 7/350 2026-11-06 02:13 by qL1cU46YIdK0
[考研] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +4 ttH3f1oA6ace 2026-11-04 10/500 2026-11-06 02:04 by qL1cU46YIdK0
[硕博家园] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 ttH3f1oA6ace 2026-11-04 9/450 2026-11-06 02:02 by qL1cU46YIdK0
[硕博家园] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +4 hNpp4Y2CGvSC 2026-11-04 12/600 2026-11-06 01:53 by qL1cU46YIdK0
信息提示
请填处理意见