| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8720 人关注过本帖
标题:两个超大数相加,相乘
只看楼主 加入收藏
zzxwill
Rank: 1
等 级:新手上路
帖 子:398
专家分:0
注 册:2007-8-15
收藏
 问题点数:0 回复次数:12 
两个超大数相加,相乘
用一个整型数组表示一个大数,数组的每个元素储存大数的一位数字,则实际的大数d表示为: d=a[k]*10的k-1次幂+a[k-1]*10的k-2次幂+......+a[2]*10+a[1] 其中a[0]保存该大数的位数.请实现两个大数相加,乘.

我不知道应该如何处理.这么大的数超过了int ,long int ,double等.
搜索更多相关主题的帖子: 相乘 相加 
2007-08-30 09:45
chen7806
Rank: 1
等 级:新手上路
威 望:2
帖 子:160
专家分:0
注 册:2007-8-5
收藏
得分:0 

注意数据类型,不要超过数据规定的上下限就行。

2007-08-30 12:46
Destruction
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-8-23
收藏
得分:0 
回复:(zzxwill)两个超大数相加,相乘

/*
本程序假设所输入的大数均在20位以内,并且输入数字时候假定不出现非法情况(例如不存在这样情况123a78ty等)
这里只完成了大数的乘法运算
*/
#include "stdio.h"
#define MAX 21

void InputNumber(int []); //输入大数
void InitNumber(int []); //初始化用于存放结果的数组
void Multi(int [],int [],int []); //进行大数乘法
void singleMulti(int [],int,int []); //对大数乘以一位数的函数
void Add(int [],int []); //对结果进行错位相加
void printresult(int []); //输出结果

void main()
{
int largenumber1[MAX],largenumber2[MAX],mResult[2 * MAX -1];
//largenumber1[]和largenumber2[]表示要相乘的大数
//mResult[]表示结果存放的数组,显然其位数不会超过2 * (MAX - 1)
printf("Input the first number:\n");
InputNumber(largenumber1);
printf("Input the second number:\n");
InputNumber(largenumber2);
InitNumber(mResult);
Multi(largenumber1,largenumber2,mResult);
printf("The result is:\n");
printresult(mResult);
getchar();
}

void InputNumber(int largenumber[])
{
char numberchar;
int i = 0;
scanf("%c",&numberchar);
while(numberchar != '\n' && i < MAX) //最初输入大数用字符串表示
{
largenumber[++i] = numberchar - '0';
scanf("%c",&numberchar);
}
largenumber[0] = i;
}

void InitNumber(int result[])
{
for(int i = 0; i < 2 * MAX - 1; i++)
result[i] = -1;
}

void Multi(int number1[],int number2[],int result[])
{
int i;
int temper[2 * MAX - 1];
for(i = number2[0]; i >= 1; i--)
{
singleMulti(number1,number2[i],temper);
Add(result,temper);
}
}

void singleMulti(int number1[],int number2,int temper[])
{
int i,t = 0,c = 2 * MAX - 2;
for(i = number1[0]; i >= 1; i--)
{
int tempernumber = number2 * number1[i];
temper[c--] = (tempernumber + t) % 10;
t = (int)((tempernumber + t) / 10);
}
if (t > 0)
{
temper[c] = t;
temper[0] = 2 * MAX - 2 - c + 1;
}
else
temper[0] = 2 * MAX -2 - c;
}

void Add(int result[],int temper[])
{
static int pos = 2 * MAX - 2;
int c = pos,t = 0;
for(int i = 2 * MAX - 2; i > 2 * MAX - 2 - temper[0]; i--)
{
if (result[c] == -1)
result[c] = 0;
int tempernumber = result[c] + temper[i];
result[c--] = (tempernumber + t) % 10;
t = (int)(tempernumber / 10);
}
if (t == 1)
result[c] = 1;
pos--;
}

void printresult(int result[])
{
for(int i = 1; i < 2 * MAX - 1 ; i++)
if (result[i] != -1)
printf("%d",result[i]);
}

2007-08-30 12:47
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
大数的运算就是模仿手动操作.

倚天照海花无数,流水高山心自知。
2007-08-30 13:41
zzxwill
Rank: 1
等 级:新手上路
帖 子:398
专家分:0
注 册:2007-8-15
收藏
得分:0 

具体一点呢?


一分耕耘,一分收获。
2007-08-30 15:31
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
收藏
得分:0 
用链表做,把两个大数分别看作两个链表,再申请一个节点,存进位,然后就象做乘法式子,把得的结果覆盖刚才其中一个算过的乘数的那个节点里即可,依次做之。我做这题,设计了递归,不过我同学说破我的算的特别慢,学习中

You have lots more to work on! Never give up!c language!
2007-08-30 16:54
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
以下是引用栖柏在2007-8-30 16:54:57的发言:
用链表做,把两个大数分别看作两个链表,再申请一个节点,存进位,然后就象做乘法式子,把得的结果覆盖刚才其中一个算过的乘数的那个节点里即可,依次做之。我做这题,设计了递归,不过我同学说破我的算的特别慢,学习中

链表当然慢啊




by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

请大家不要用TC来学习C语言
C/C++算法习题(OnlineJudge):[url]http://yzfy.org/[/url]

2007-08-30 16:56
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
收藏
得分:0 

谢谢雨燕,我现在也没怎么想,今天我看了这题,回去再想想拉

学习中


You have lots more to work on! Never give up!c language!
2007-08-30 16:57
iaw398492065
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-8-21
收藏
得分:0 
去看下《C语言抽象思想——C语言描述》上面就有说,一本不错的书。斯坦福大学第二本C语言的教材
2007-08-31 17:38
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
收藏
得分:0 
小燕子的blog上有这两个大数相乘的算法,超短,超快~~~~`

不过就是短到我现在还没全部看明白!

偶学编程,也许本身就是一个错。。。
2007-08-31 17:42
快速回复:两个超大数相加,相乘
数据加载中...
 
   



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

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