C大整数乘法(十进制)

C大整数乘法
//MULTIPLY.c

#include
#include
#include
#include
#define MAXSIZE 10000
#define WORD int
#define TestLength 400
#define TestCount 10000000

void Multiply(WORD *R,WORD *A,WORD *B,unsigned int N)
{
int i, j;
int posR;
for(i=0;i<2*MAXSIZE+1;i++)
R[i]=0;
for(i=N-1; i>=0; --i)
{
//0参与计算,结果为0,直接跳过
if(A[i] == 0)
continue;
int carry = 0;
for(j=N-1; j>=0; --j)
{
//计算结果存放的位置
posR = 2*MAXSIZE+1 - N- N + 1 + i + j;
//带进位乘法计算,并放入相应的R数组中
R[posR] += A[i] * B[j] + carry;
//判断相乘的结果是否大于10,并对结果进行处理
carry = R[posR] / 10;
//计算并保存本次进位
R[posR] %= 10;
}
//存储最后一次计算的进位
R[posR-1] = carry;
}
i=0;
//去掉C数组中的前导0,并打印结果
while(i<2*MAXSIZE+1-1 && R[i]==0 )
++i;
printf("R=");
for(i; i<2*MAXSIZE+1; ++i)
printf("%d",R[i]);
printf("n");
}

int CharToInt(char c)
{
return c-'0';
}


int main()
{
//定义两个数组存放乘数和被乘数a和b,
//并将结果转化为整型后存放在A和B两个整型数组中,两个数组的长度相同
char a[MAXSIZE],b[MAXSIZE];
int A[MAXSIZE],B[MAXSIZE];
int M[MAXSIZE],N[MAXSIZE];//用于存放随机生成的乘数与被乘数用于测试
int C[2*MAXSIZE+1];//存放A和B的乘积
int D[2*MAXSIZE+1]={0};//存放M和N的乘积
int LenA,LenB,i,j;
//输入第一个乘数,并进行有效性判断
printf("Please input the first number:n");
scanf("%s",a);
LenA=strlen(a);
for(i=0;i<=LenA-1;i++)
{
if((a[i]-'0')<0||(a[i]-'0')>9)
{
printf("It is not right,please input the first number againn");
scanf("%s",a);
LenA=strlen(a);
i=-1;
}

}
//输入第二个乘数,并进行有效性判断
printf("Please input the second number:n");
scanf("%s",b);
LenB=strlen(b);
for(i=0;i<=LenB-1;i++)
if((b[i]-'0')<0||(b[i]-'0')>9)
{
printf("It is not right,please input the second number againn");
scanf("%s",b);
LenB=strlen(b);
i=-1;
}


//int count;
//time_t BeginTime,EndTime;
//BeginTime=time(NULL);
//for(count=0;count
//for(i=0;i
//A[i]=CharToInt(a[i]);
//EndTime=time(NULL);
//printf("The Testing Time is:");
//printf("%d",EndTime-BeginTime);
//printf("n");

//将a中的每一个字符都转化为数字,保存在A数组中
//BeginTime=time(NULL);
//for(count=0;count
for(i=0;i
A[i]=a[i]-'0';
//EndTime=time(NULL);
//printf("The Testing Time is:");
//printf("%d",EndTime-BeginTime);
//printf("n");

//显示A数组中的值
printf("The data are:n");
printf("A=");
for(i=0;i
printf("%d",A[i]);
printf("n");

将b中的每一个字符都转化为数字,保存在B数组中
for(i=0;i
B[i]=b[i]-'0';
printf("B=");
for(i=0;i
printf("%d",B[i]);
printf("n");

Multiply(C,A,B,LenA);//A和B相乘,结果放C数组中


//以下是测试程序
printf("******************************************************");
printf("nThe Following is The Testing Sectionn");
int TestArrayResult[161];
int TestArrayA[]={9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9};
int TestArrayB[]={0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0};
printf("The first Testing: 80个9乘以80个0nThe Result is:n");
Multiply(TestArrayResult,TestArrayA,TestArrayB,80);
printf("n");

printf("The second Testing: 80个9乘以80个9nThe Result is:n");
Multiply(TestArrayResult,TestArrayA,TestArrayA,80);
printf("n");

printf("The third Testing: 80个0乘以80个0nThe Result is:n");
Multiply(TestArrayResult,TestArrayB,TestArrayB,80);
printf("n");

printf("Random Testing:(TestLength can be changed)n");
srand((unsigned int) time (NULL));
//生成第一个随机数,作为第一个乘数
printf("The first Random Number:n");
for(i=0;i
{
M[i]=rand()%10;
printf("%d",M[i]);
}
printf("n");
//生成第二个随机数,作为另一个乘数
printf("The Second Random Number:n");
for(j=0;j
{
N[j]=rand()%10;
printf("%d",N[j]);
}
printf("n");
//M和相乘,结果放在D数组中
Multiply(D,M,N,TestLength);

system("PAUSE");
return 0;

}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/721601/viewspace-751358/,如需转载,请注明出处,否则将追究法律责任。

user_pic_default.png
请登录后发表评论 登录
全部评论
<%=items[i].createtime%>

<%=items[i].content%>

<%if(items[i].items.items.length) { %>
<%for(var j=0;j
<%=items[i].items.items[j].createtime%> 回复

<%=items[i].items.items[j].username%>   回复   <%=items[i].items.items[j].tousername%><%=items[i].items.items[j].content%>

<%}%> <%if(items[i].items.total > 5) { %>
还有<%=items[i].items.total-5%>条评论 ) data-count=1 data-flag=true>点击查看
<%}%>
<%}%>
<%}%>

注册时间:2012-12-15

  • 博文量
    4
  • 访问量
    10567

转载于:http://blog.itpub.net/721601/viewspace-751358/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值