关于C语言实现两个大数相乘解决方案
关于C语言实现两个大数相乘
昨天天参加华为技术面试,最后一道题是实现两个30位大数相乘,想了半个小时没想出来,虽然过了,但是感觉很丢脸。哪位大虾知道C语言中一般不定长大数相乘应该以什么思路去解决?提供个思路就行谢谢各位!
------解决方案--------------------
同意上面肯定用字符串来表示
我的想法是拆开来
比如23*45
就分别算2*4,2*5,3*4,3*5
最后根据所在的位数(个,十,百,千......)
在输出的是分别对待(在什么位置,先后顺序).
------解决方案--------------------
对于大数,只是因为没有基本的数据类型去存储,所以可以用数组去存储大数,例如一个字节存储一个数字。
如果用笔计算两个数字相乘,是怎样做的呢。
125
x 11
-------
125
125
--------
1375
对数组进行类似操作就可以了。
------解决方案--------------------
这样吧
struct number
{
unsigned short value;
unsigned short n;//n是阶
};
你搞3个这样的数组a[30] b[30], result[60]
------解决方案--------------------
昨天天参加华为技术面试,最后一道题是实现两个30位大数相乘,想了半个小时没想出来,虽然过了,但是感觉很丢脸。哪位大虾知道C语言中一般不定长大数相乘应该以什么思路去解决?提供个思路就行谢谢各位!
------解决方案--------------------
同意上面肯定用字符串来表示
我的想法是拆开来
比如23*45
就分别算2*4,2*5,3*4,3*5
最后根据所在的位数(个,十,百,千......)
在输出的是分别对待(在什么位置,先后顺序).
------解决方案--------------------
对于大数,只是因为没有基本的数据类型去存储,所以可以用数组去存储大数,例如一个字节存储一个数字。
如果用笔计算两个数字相乘,是怎样做的呢。
125
x 11
-------
125
125
--------
1375
对数组进行类似操作就可以了。
------解决方案--------------------
这样吧
struct number
{
unsigned short value;
unsigned short n;//n是阶
};
你搞3个这样的数组a[30] b[30], result[60]
------解决方案--------------------
- C/C++ code
# include<stdio.h> # include<string.h> # include<malloc.h> void multiply(char* a,char* b,char* c) { int i,j,ca,cb,* s; ca=strlen(a); cb=strlen(b); s=(int*)malloc(sizeof(int)*(ca+cb)); for (i=0;i<ca+cb;i++) s[i]=0; for (i=0;i<ca;i++) for (j=0;j<cb;j++) s[i+j+1]+=(a[i]-'0')*(b[j]-'0'); for (i=ca+cb-1;i>=0;i--) if (s[i]>=10) { s[i-1]+=s[i]/10; s[i]%=10; } i=0; while (s[i]==0) i++; for (j=0;i<ca+cb;i++,j++) c[j]=s[i]+'0'; c[j]='\0'; free(s); }