24小时热门版块排行榜    

查看: 1643  |  回复: 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):谢谢参与
祝福
相关版块跳转 我要订阅楼主 青涩草 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 理学,工学,农学调剂,少走弯路,这里欢迎您! +5 likeihood 2026-03-02 8/400 2026-03-02 20:39 by ji493940045
[考研] 求调剂 +7 repeatt?t 2026-02-28 7/350 2026-03-02 20:34 by hypershenger
[考研] 298求调剂 +10 人间唯你是清欢 2026-02-28 13/650 2026-03-02 20:33 by hypershenger
[考研] 材料复试调剂 +5 学材料的点 2026-03-01 6/300 2026-03-02 20:01 by hypershenger
[考研] 289求调剂 +8 yang婷 2026-03-02 9/450 2026-03-02 19:08 by zhukairuo
[考研] 化工专硕348,一志愿985求调剂 +6 弗格个 2026-02-28 9/450 2026-03-02 14:09 by liyongv
[考研] 求调剂 +3 熬夜的猫头鹰 2026-03-02 3/150 2026-03-02 11:45 by 刘兵
[基金申请] 此成果不能导入原因:元数据必填信息不完整,可 进行补充。 +4 Kittylucky 2026-03-02 5/250 2026-03-02 11:07 by jurkat.1640
[考研] 274求调剂 +3 cgyzqwn 2026-03-01 7/350 2026-03-02 10:38 by lature00
[考研] 0854复试调剂 276 +4 wmm9 2026-03-01 6/300 2026-03-02 09:28 by 热情沙漠
[考研] 279求调剂 +3 dua1 2026-03-01 4/200 2026-03-02 00:23 by 大脸蛋子
[基金申请] 成果系统访问量大,请一小时后再尝试。---NSFC啥时候好哦,已经两天这样了 +4 NSFC2026我来了 2026-02-28 4/200 2026-03-01 22:37 by 铁门栓
[考研] 化工299分求调剂 一志愿985落榜 +5 嘻嘻(*^ω^*) 2026-03-01 5/250 2026-03-01 19:47 by 无际的草原
[考研] 一志愿中南大学理学化学 +4 15779376950 2026-03-01 5/250 2026-03-01 19:00 by Fff-1
[考研] 313求调剂 +3 水流年lc 2026-02-28 3/150 2026-03-01 16:01 by 新能源达人
[考研] 调剂 +3 简木ChuFront 2026-02-28 3/150 2026-03-01 11:46 by 王伟要上岸啊
[考研] 311求调剂 +9 南迦720 2026-02-28 10/500 2026-03-01 10:55 by sunny81
[考研] 307求调剂 +4 73372112 2026-02-28 6/300 2026-03-01 00:04 by ll247
[考研] 304求调剂 +3 52hz~~ 2026-02-28 5/250 2026-03-01 00:00 by 52hz~~
[高分子] 求环氧树脂研发1名 +3 孙xc 2026-02-25 11/550 2026-02-28 16:57 by ichall
信息提示
请填处理意见