| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 527 人关注过本帖
标题:高精度乘法
只看楼主 加入收藏
yutiantian
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-7-25
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
高精度乘法
高精度乘法写不明白了,求大神详解!!!
2014-07-25 15:37
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:10 
用现成的大数库很容易 再说代码有很多 不能抄么
2014-07-25 17:52
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:10 
程序代码:
void Susake_add(char *s1, char *s2){
    int len1 = strlen(s1), len2 = strlen(s2), len, i;
    int a[N] = {0}, b[N] = {0};
    for(i = 0; i < len1; a[i] = s1[len1 - 1 - i++] - '0') ;
    for(i = 0; i < len2; b[i] = s2[len2 - 1 - i++] - '0') ;
    len = len1 > len2 ? len1 : len2;
    for(i = 0; i < len; i++) {
        a[i] += b[i];
        if(a[i] >= 10) {
            a[i] %= 10;
            a[i+1]++;
        }
    }
    if(a[len]) printf("%d", a[len]);
    for(i = len - 1; i >= 0; printf("%d", a[i--]));
}

仰望星空...........不忘初心!
2014-07-26 02:41
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
程序代码:
void Susake_mul(char *s1, char *s2){
    int len1 = strlen(s1), len2 = strlen(s2), len, i, j, k = 0, tip = 0, tag = 0;
    int a[N] = {0}, b[N] = {0}, c[N] = {0};
    for(i = 0; i < len1; a[i] = s1[len1 - 1 - i++] - '0') ;
    for(i = 0; i < len2; b[i] = s2[len2 - 1 - i++] - '0') ;
    for(i = 0; i < len1; i++) {
        for(j = 0; j < len2; j++) {
            if(a[i] * b[j] >= 10) {
                c[k] += a[i] * b[j] % 10;
                if(c[k] >= 10){
                    c[k] = c[k] % 10;
                    c[k + 1]++;
                }
                c[k + 1] += a[i] * b[j] / 10;
                if(c[k + 1] >= 10){
                    c[k + 1] = c[k + 1] % 10;
                    c[k + 2]++;
                }
            }
            else {
                c[k] += a[i] * b[j];
                if(c[k] >= 10) {
                    c[k] = c[k] % 10;
                    c[k + 1]++;
                    if(c[k + 1] >= 10){
                        c[k + 1] = c[k + 1] % 10;
                        c[k + 2]++;
                    }
                }
            }
            k++;
            tag = k;
        }
        tip++;
        k = tip;
    }
    if(c[tag]) printf("%d", c[tag]);
    for(i = tag - 1; i >= 0; i--)
        printf("%d", c[i]);
}

仰望星空...........不忘初心!
2014-07-26 02:42
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
程序代码:
char *Susake_com(char *a, char *b)

 {
     char *res;
     res = (char *)malloc(10 * sizeof(char));
     int len1 = strlen(a), len2 = strlen(b), i, t = 0;
     if(a[0] != '-' && b[0] != '-') {
         if(len1 > len2) {
             strcpy(res, "a>b");
             return res;
         }
         else if(len1 == len2) {
             for(i = 0; i < len1; i++) {
                 t++;
                 if((a[i] - '0') == (b[i] - '0')) ;
                 else if((a[i] - '0') < (b[i] - '0')) {
                     strcpy(res, "a<b");
                     return res;
                 }
                 else {
                     strcpy(res, "a>b");
                     return res;
                 }
                 if(t == len1) {
                    strcpy(res, "a==b");
                    return res;
                 }
             }
         }
         else {
            strcpy(res, "a<b");
            return res;
         }
     }
     if(a[0] == '-' && b[0] == '-') {
         if(len1 > len2) {
            strcpy(res, "a<b");
            return res;
         }
         else if(len1 == len2) {
             for(i = 1; i < len1; i++) {
                 t++;
                 if((a[i] - '0') == (b[i] - '0')) ;
                 else if((a[i] - '0') > (b[i] - '0')) {
                    strcpy(res, "a<b");
                    return res;
                 }
                 else if((a[i] - '0') < (b[i] - '0')) {
                     strcpy(res, "a>b");
                     return res;
                 }
                 if(t == len1 - 1) {
                    strcpy(res, "a==b");
                    return res;
                 }
             }
         }
         else {
            strcpy(res, "a>b");
            return res;
         }
     }
     if(a[0] == '-' && b[0] != '-') {
        strcpy(res, "a<b");
        return res;
     }
     if(b[0] == '-' && a[0] != '-') {
        strcpy(res, "a>b");
        return res;
     }

 }


[ 本帖最后由 Susake 于 2014-7-26 21:23 编辑 ]

仰望星空...........不忘初心!
2014-07-26 02:42
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
加,乘,比较...传2个字符串可以用~~

[ 本帖最后由 Susake 于 2014-7-26 04:27 编辑 ]

仰望星空...........不忘初心!
2014-07-26 02:43
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
程序代码:
void Susake_sub(char *s1, char *s2)
{
    int len, len1, len2, i, j;
    int a[N] = {0}, b[N] = {0};
    char s3[N];
    memset(s3, 0, sizeof(s3));
    char *s = (char *)malloc(10 * sizeof(char));
    s = Susake_com(s1, s2);
    if(strcmp("a<b", s) == 0) {
        strcpy(s3, s1);
        strcpy(s1, s2);
        strcpy(s2, s3);
        printf("-");
    }
    free(s);
    len1 = strlen(s1); len2 = strlen(s2);
    for(i = 0; i < len1; a[i] = s1[len1 - 1 - i++] - '0') ;
    for(i = 0; i < len2; b[i] = s2[len2 - 1 - i++] - '0') ;
    len = len1 > len2 ? len1 : len2;
    for(int i = 0; i < len; i++) {
        if(a[i] - b[i] >= 0) a[i] -= b[i];
        else {
            a[i] = a[i + 1] == 0 && i + 1 == len1 ? b[i] - a[i] : a[i] + 10 - b[i];
            a[i + 1]--;
        }
    }
    if(a[len - 1] || len == 1) printf("%d", a[len - 1]);
    for(int i = len - 2; i >= 0; i--)
        printf("%d", a[i]);
    printf("\n");
}

仰望星空...........不忘初心!
2014-07-26 21:22
快速回复:高精度乘法
数据加载中...
 
   



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

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