长整数的计算

//声明:本人所作博客均为自己学习复习所用

题目:
假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,实际的长整数m表示为:m=a[k]×10k-1+a[k-1]×10k-2+….+a[2]×10+a[1]
其中a[0]保存该长整数的位数。完成:长整数乘普通整数。

#include<stdio.h>
#include<string.h>

void CharToNum(int num[],char arr[])
{
	int i=0;
	int len=strlen(arr);
	num[0]=len;//num[0]储存位数 
	for(i=0;i<len;i++)
	{
		num[len-i]=arr[i]-'0';
	}
}//将字符数组逆序储存在整型数组中,低位在前,高位在后 
 //个位数为num[1],十位数num[2] ……


void multiply(int a[],int b[],int c[],int maxlen)
{
	int i=0,j=0;
	for(i=1;i<=maxlen;i++)
	{
		for(j=1;j<=maxlen;j++)
		{
			c[i+j]+=a[i]*b[j];
		}
	}//将两个数组的每一位相乘,相加的结果保存到同一个位置
	
	
	for(i=2;i<2*maxlen+1;i++)
	{
		c[i+1]=c[i+1]+c[i]/10;
		c[i]=c[i]%10;
	}//计算进位,数组中的每个元素大于10的向高位进一位 
}


int main()
{
	int i=0,j=0;
	char longNuma[100],longNumb[100];
	printf("请输入两个长整数:\n");
	scanf("%s %s",&longNuma,&longNumb);
	//输入两个长整数 ,用字符数组储存 
	
	
	int temp1=0,temp2=0;
	if(longNuma[0]=='-')
	{
		temp1=1;
		for(i=0;i<strlen(longNuma);i++)
		{
			longNuma[i]=longNuma[i+1];
		}
	}//判断longNuma中的数是否为负数,如果是则去掉负号,长度减一 
	if(longNumb[0]=='-')
	{
		temp2=1;
		for(i=0;i<strlen(longNumb);i++)
		{
			longNumb[i]=longNumb[i+1];
		}
	}//判断longNumb中的数是否为负数,如果是则去掉负号,长度减一 
	
	
	int maxlen=strlen(longNuma)>strlen(longNumb)?strlen(longNuma):strlen(longNumb);
	//求出两个字符数组中的最大长度 
	
	int a[110]={0}; 
	int b[110]={0};
	CharToNum(a,longNuma);
	CharToNum(b,longNumb);
	//将字符转化成整数 并逆序储存 
	
	int res[201]={0};
	multiply(a,b,res,maxlen);//对两个整数进行相乘 得到逆序的结果 
	printf("长整数乘积为:") ;
	
	if(temp1==1&&temp2==0||temp1==0&&temp2==1)
	{
		printf("-");
	}//若两个数异号则加负号 
	
	int flag=1;
	for(i=2*maxlen+1;i>=2;i--)
	{
		if(res[i]==0&&flag==1)
		{
			continue;
		}
		printf("%d",res[i]);
		flag=0;
	}//将逆序的元素正序,同时把正序后首位的0去掉 
	printf("\n");
	
	return 0;
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐