24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1444  |  回复: 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):谢谢参与
祝福
相关版块跳转 我要订阅楼主 青涩草 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见