| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5232 人关注过本帖
标题:c语言第一次接触高精度乘法,求代码。
只看楼主 加入收藏
sunchao16
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-10-24
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:19 
c语言第一次接触高精度乘法,求代码。
题目描述 Description
给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过100000位。
输入描述 Input Description
读入两个用空格隔开的正整数
输出描述 Output Description
输出A*B的值
样例输入 Sample Input
4 9
样例输出 Sample Output
36
数据范围及提示 Data Size & Hint
两个正整数的位数不超过100000位
搜索更多相关主题的帖子: c语言 正整数 
2016-10-24 22:14
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:3 
你可以定义输入的A,B为double 类型 ,double有效数字16位,float有效数字6位,代码如下
#include<stdio.h>
main()
{
    double A,B,C;
    printf("请输入两个正整数:\n");
    scanf("%lf%lf",&A,&B);
    C=A+B;
   
    printf("\n%lf",C);
}

早知做人那么辛苦!  当初不应该下凡
2016-10-24 22:45
sunchao16
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-10-24
收藏
得分:0 
回复 2楼 炎天
谢谢,但是这个题具体到位数不超过100000,应该用到高精度乘法,这是社团笔试题,说是最难的一题,不会这么简单的。
2016-10-24 22:55
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:3 
用数组保存A和B,再用乘法公式计算A和B的乘积,A和B的乘积不超过200000位。

未佩好剑,转身便已是江湖
2016-10-24 22:59
百里
Rank: 2
等 级:论坛游民
帖 子:34
专家分:66
注 册:2016-10-1
收藏
得分:3 
回复 2楼 炎天
不是 C=A*B 吗???
2016-10-24 23:53
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:3 
//先看一下,我也不知道对不对

因为你的数的位数很大,任何简单类型的变量都无法直接存储。
我觉得可以用两个字符串接收输入的两个数,数的大小不超过10^6位,字符数组的大小不超过10^6个 ,   10^6B大约1MB
定义1:  乘法就是加法
       a[10^6],    b1[10^6]   c[2*10^6]={0}
       b1用来计数。每次减一,c都加一个a。个位相加进位到十位,依次类推。
       若b1个位减为0,向10位借1,若个位十位为0,向百位借1,依次类推。低位都不够时,如百位减1,百位之后的十位和个位赋值为9,。直到b1减为0.
       b1判0准则。先计算b1长度,若借位超过b1长度,则b1减为0了。

定义2: 相乘
       a[10^6],    b[10^6]   c[2*10^6]={0}
       先b的个位数从a的个位数到最高位依次相乘,乘一个就立刻加到c上,记住进位。b的十位乘a应该从c的十位开始相加,依次类推
        334                第一次334*3         4*3=12   c的个位是2,进位1.  3*3+1(进位)=0,进位1   3*3+1(进位)=0,进位1          结果1002  (从c的个位开始加),i指向c相加的最低位
      * 223                第二次334*20        4*2=8(进位0)+0 = 8(进位0)   3*2=6(进位0)+0=6(进位0)   3*2=6(进位0)+1=7(进位0)   结果7682  (从c的十位开始加),int i;4个字节,2^32
      =1002               第三次334*200        4*2=8(进位0)+6=4(进位1)     3*2+1=7(进位0)+7=4(进位1)  3*2+1=7(进位0)           结果74482 (从c的百位开始加)
      +668
     +668
     =74482   

[此贴子已经被作者于2016-10-25 07:54编辑过]

2016-10-25 00:02
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:3 
不知道有没有其他算法,感觉这个题目出的有点变态。
实际上7楼算超大数乘法结果所需内存容量是错误的,如果按照楼上用字符数组的做法,要存储结果需要10^6*10^6=10^12共1000G的内存存储,而不是2*10^6的2M内存,这是不可能的。
题意要求100000=10^5,最终乘法结果最大位数是10^5*10^5=10^10,仍然有10G的位数,一个unsigned int能有效表达9位数需要4字节,最低仍需要10*4/9=4G的内存,这也很变态了。估计题意实际要求的A、B是1000位。
2016-10-25 09:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:3 
以下是引用xzlxzlxzl在2016-10-25 09:33:09的发言:

不知道有没有其他算法,感觉这个题目出的有点变态。
实际上7楼算超大数乘法结果所需内存容量是错误的,如果按照楼上用字符数组的做法,要存储结果需要10^6*10^6=10^12共1000G的内存存储,而不是2*10^6的2M内存,这是不可能的。
题意要求100000=10^5,最终乘法结果最大位数是10^5*10^5=10^10,仍然有10G的位数,一个unsigned int能有效表达9位数需要4字节,最低仍需要10*4/9=4G的内存,这也很变态了。估计题意实际要求的A、B是1000位。
你算错了吧
5楼alice_usnet说的才是正确的
2016-10-25 09:46
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:3 
以下是引用sunchao16在2016-10-24 22:55:22的发言:

谢谢,但是这个题具体到位数不超过100000,应该用到高精度乘法,这是社团笔试题,说是最难的一题,不会这么简单的。

其实也不是很难

小学生 多位数乘以多位数 用电脑模拟计算即可

DO IT YOURSELF !
2016-10-25 09:50
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 

数相乘,乘积位数不是相乘,我错了,5楼和7楼关于乘积位数是对的!
2016-10-25 10:05
快速回复:c语言第一次接触高精度乘法,求代码。
数据加载中...
 
   



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

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