如何利用C语言计算 123456789*987654321,谢谢真诚的你!

jyzdtn 2010-10-10 09:43:08
我面试的时候

用 int 保存的数据

回想起来真不合理!!
...全文
1499 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
春知AI工作室 2010-11-02
  • 打赏
  • 举报
回复
高精度问题。
LinkSe7en 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]

用数组模拟小学三年级的乘法竖式计算过程。
[/Quote]
厉害 我看了都要好好想想才明白 惭愧了
yangzhm1008 2010-11-01
  • 打赏
  • 举报
回复
挺好。。。哈哈
jyzdtn 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 zeroprimeval 的回复:]
用字符串来模拟计算,我用的C++,你可以自己改下
#include <iostream>
#include <cstdlib>
#include <ctype.h>
#include <windows.h>
#define N 10000
using namespace std;
void main()
{
char str1[N],str2[N];
int *a,*b,*c,……
[/Quote]
改什么啊
無_1024 2010-10-29
  • 打赏
  • 举报
回复

#include <iostream>
#include <cstring>
#include <malloc.h>
using namespace std;
const int MAX = 1000;//控制输入数据的位数

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);
}

int main()
{
char number1[MAX],number2[MAX],*multi;
cout<<"please input number1: "<<endl;
cin>>number1;
cout<<"please input number2: "<<endl;
cin>>number2;
multi=(char*)malloc(strlen(number1)+strlen(number2));
multiply(number1,number2,multi);
cout<<number1<<" * "<<number2<<" = "<<multi<<endl;
return 0;
}
xiaolomg 2010-10-29
  • 打赏
  • 举报
回复
其实比较easy,就是大数加法。
nwao7890 2010-10-29
  • 打赏
  • 举报
回复
学习了
jackyloncoln 2010-10-29
  • 打赏
  • 举报
回复
学习了!
npulin 2010-10-29
  • 打赏
  • 举报
回复
用数组
hdusunny44 2010-10-29
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

int mulBigNum(char *a,char *b, char *res)
{
int lenA,lenB;
int flag = 0;
int mul;
int temp,i,j;

lenA = strlen(a);
lenB = strlen(b);
for(i=0;i<lenA/2;i++)
{
a[i] -=48;
a[lenA-i-1] -=48;
temp = a[i];
a[i] = a[lenA-i-1];
a[lenA-i-1] = temp;
}
if(lenA%2)
a[lenA/2] -= 48;
for(i=0;i<lenB/2;i++)
{
b[i] -=48;
b[lenB-i-1] -=48;
temp = b[i];
b[i] = b[lenB-i-1];
b[lenB-i-1] = temp;
}
if(lenB%2)
b[lenB/2] -= 48;

for(i=0;i<lenA;i++)
{
mul = a[i];
temp = 0;
for(j=i;j<lenB+i;j++)
{
temp += mul*b[j-i]+res[j];
res[j] = temp%10;
temp = temp/10;
}
while(temp)
{
res[j++] = temp%10;
temp = temp/10;
}
}
return j;
}
wangchensong 2010-10-29
  • 打赏
  • 举报
回复
不会 学习了一下 呵呵
Rainny1214 2010-10-29
  • 打赏
  • 举报
回复
ALL楼上,有没有编写简洁的版本?
bo_00 2010-10-29
  • 打赏
  • 举报
回复
就像我们小学算乘法一样。

一位一位乘,大于10进位。
bo_00 2010-10-29
  • 打赏
  • 举报
回复
这就是大数运算,和 n! 求阶乘一样。
恐龙大帝 2010-10-26
  • 打赏
  • 举报
回复
用字符串来模拟计算,我用的C++,你可以自己改下
#include <iostream>
#include <cstdlib>
#include <ctype.h>
#include <windows.h>
#define N 10000
using namespace std;
void main()
{
char str1[N],str2[N];
int *a,*b,*c,m,n,i,j,k,x;
cout<<"input the number of multiplicand:";
cin>>str1;
cout<<"input the number of multiplies:";
cin>>str2;
m=strlen(str1);
n=strlen(str2);
a=new int[m];
b=new int[n];
c=new int[m+n];
for(i=0;i<m;i++)
{
if(isdigit(str1[m-i-1])) //将被乘数和乘数从字符串数组中提取出来,并且倒叙放入a,b两个数组
a[i]=str1[m-i-1]-48;
}
for(j=0;j<n;j++)
{
if(isdigit(str2[m-j-1]))
b[j]=str2[m-j-1]-48;
}
if(str1[0]=='0'||str2[0]=='0')
cout<<"0"<<endl;
else
{
for(i=0;i<m+n;i++)
c[i]=0;
for ( i=0;i<n;i++)
for(j=0;j<m;j++)
{
k=m+n-1;
c[k-i-j]+=b[i]*a[j];
x=c[k-i-j];
while (x>=10) //处理进位
{
c[k-i-j]=x%10;
c[k-i-j-1]+=x/10;
x=c[k-i-j-1];
k--;
}
}
for(i=0;i<m+n;i++)
if(c[i]!=0)
break;
cout<<str1<<endl;
cout<<"X"<<endl;
cout<<str2<<endl;
for(k=i;k<m+n;k++)
cout<<c[k];
cout<<endl;
}
system("pause");

}


jyzdtn 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yunchao630 的回复:]
不好意思,刚才写错了,呵呵
[/Quote]
哪里写错啊
jyzdtn 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 doox8086 的回复:]
楼上楼下所说的:用竖式模拟计算
123456789 * 987654321

multiLB("987654321", 9, "123456789", 9);
结果:121932631112635269


C/C++ code

////////////
// 长整数相乘 a * b
// char [] a: //
// size_T al: 字符数组 a[] 有……
[/Quote]
multiLB("987654321", 9, "123456789", 9);什么意思
dingshiqi555 2010-10-12
  • 打赏
  • 举报
回复
char* bigmul(char* src_a,char* src_b)
{
int len=strlen(src_a)+strlen(src_b);
char* result=(char*)malloc((len+1)*sizeof(char));
int i,j,d,s,k=0,shift=0;
memset(result,'0',len);
result[len]='\0';
for(i=strlen(src_a)-1;i>=0;i--)
{
d=0; k=shift;
for(j=strlen(src_b)-1;j>=0;j--)
{
if(k<len-1)
s=(src_a[i]-'0')*(src_b[j]-'0')+d+result[k]-'0';
else
{
free(result);
return NULL;
}
result[k]=s%10+'0';k++;
d=s/10;
}
shift++;

}
result[k]='\0';
i=0;
while(i<k/2)
{
d=result[i];
result[i]=result[k-i-1];
result[k-i-1]=d;
i++;
}

return result;
}
lpmark 2010-10-12
  • 打赏
  • 举报
回复
简单的大数乘法!
beatles_wang 2010-10-12
  • 打赏
  • 举报
回复
呵呵,看到了简洁之美
加载更多回复(19)

70,011

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧