标题:大数高精运算-----乘法
只看楼主
vvilp
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-3-1
 问题点数:0 回复次数:5 
大数高精运算-----乘法
高精乘法
-----------------------------------------------------------------------
先写个两个数的乘积 有空改成个多个数的积
-----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int i, j, k;
char a1[50], a2[50];
int s1[50], s2[50];
int s[100];
void mul(int *s1, int *s2, int *s) {
    for (i=0; i<strlen(a1); i++)
        for (j=0; j<strlen(a2); j++)
            s[i+j]+=s1[i]*s2[j];
    int k=100;
    while (!s[k])
        --k;
    for (i=0,j=0; i<=k; i++) {
        s[i+1]+=s[i]/10;
        s[i]%=10;
    }
}
int main() {
 
 
 gets(a1);
 gets(a2);  int m=strlen(a1)+strlen(a2);
 for (i=strlen(a1)-1; i>=0; --i)
 s1[i]=(a1[strlen(a1)-i-1]-'0');
 for (i=strlen(a2)-1; i>=0; --i)
 s2[i]=(a2[strlen(a2)-i-1]-'0');
 for (i=0; i<100; i++)
 s[i]=0;
 mul(s1, s2, s);
 for (i=m-1; i>=0; --i)//
 printf("%d", s[i]); system("pause");
 }
---------------------------------------------
1010101010101010101
1010101010101010101
输出1020304050607080910090807060504030201
----------------------------------------------
-----------------------------------------------
输入任意整数!!!!!!!!!辛苦修改 !!!!!!
#include <stdio.h>
#include <stdlib.h>
int i, j, k;
char a1[100], a2[100];
int s1[1000], s2[100];
int s[1000];
int temp=1;
int main() {
    gets(a1);
    for (i=strlen(a1)-1; i>=0; --i)
        s1[i]=(a1[strlen(a1)-i-1]-'0');
//上面的  是取得s1 然后转为int 数组    
    int m=strlen(a1);//提前算出a1 长度

    while (gets(a2), strcmp(a2, "~")) {  //遇到~结束
        for (i=strlen(a2)-1; i>=0; --i)
            s2[i]=(a2[strlen(a2)-i-1]-'0');

        for (i=0; i<100; i++)
            s[i]=0;///s  初始化 开始计算了

        for (i=0; i<m; i++)
            for (j=0; j<strlen(a2); j++)
                s[i+j]+=s1[i]*s2[j];//开始计算了  结果保存到 s中

        int k=1000;
        while (!s[k])
            --k;   
        // 算出s中的有效位数  
        m=m+strlen(a2);
        for (i=0; i<=k; i++) {
            s[i+1]+=s[i]/10;
            s[i]%=10;
        }

        for (i=0; i<m; ++i)
            s1[i]=s[i];
     // temp++;  两个数乘前面多两个个零   三个数乘后面多三个零 不知道为什么  只能放个temp在这里  使后面少输出temp位  
    }
    for (i=m; i>=0; --i)  //这里改成i=m-temp 就可以少输出前面的temp位   但是发现最前面如果要进位的话就会被去掉了  无奈。。。。。  
        printf("%d", s1[i]);
}
改起来麻烦 所以就没用函数  有点美中不足 前面的零不好去掉!。。。 输入两个数前面两个零 输入三个数 前面多三个零  
--------------------------------------------------------------------
999999999999999
999999999999999
999999999999999
999999999999999
~
输出 0999999999999996000000000000005999999999999996000000000000001
-------------------------------------------------------------------------------------------终于完了 虽然写的很丑~~~~~~~  
总结 :方法类似于加法 除了这里    s[i+j]+=s1[i]*s2[j] ;
        注意格式的控制 这里得开两个数组
对了 还是请达人帮我解决前面这个零的问题吧
搜索更多相关主题的帖子: 乘法 高精 int 大数 运算 
2008-05-16 00:02
Q1007665007
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2008-5-16
得分:0 
代码还不够成熟,加油吧

QQ1007665007
QQ群61762856
2008-05-16 11:41
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
得分:0 
收藏

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-06-13 17:10
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
得分:0 
建议用二进制来完成。毕竟计算机用的是二进制运算。

人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2008-06-26 08:56
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
得分:0 
唉 原来我以前收藏过这类帖子  我都忘了

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-06-26 09:02
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
得分:0 
为啥都红了

想象力征服世界
2010-02-04 14:44
  • 6
  • 1/1页
  • 1



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-214538-1-1.html




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

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