C语言大数运算——乘法

还是大数运算,这次是乘法的。具体都写在代码里面了,就不多说。

/****************************************************************************************/ 
/*						大数运算篇——乘法   										    */ 
/*          56             分析:两个数相乘,最多不超过10的(2+2)次方,即最多4位数2+2  */ 
/*       X  44                   用乘数的每个数去乘被乘数,然后把同一列的数相加,即     */ 
/*      20  24                   24+0=24  20 + 24 =44 20+0=20                           */ 
/* 20   24                       然后,大于十的进十位数,24留4进2 44+2=46,留6进4,     */ 
/* 20   44  24                   20+4=24留4进2 最后结果就是2464                         */ 
/* 24    6   4                   可以发现一个规律,两个相乘的数,从右往左数第0位与第二  */ 
/* 结果 2464                     个数第0位,乘出来相加的列是第0列,第1位与第2位乘在第3列*/ 
/*                               得出结论:第a列的数与第b列的数字想乘得出来的结果是在   */ 
/*                               第a+b列里面相加的  	                                */ 
/****************************************************************************************/
/*
	具体问题:
			1.如何存储与计算?      输入数据在字符数组中,计算的数据变到整型数组
			2.上诉分析的6,是60,4是400,这里的处理?再转回字符数组
			3.  
//作者:fat pears 最近更新时间:2019.01.31 
/*代码实现*/
#include<stdio.h>
#include<string.h>
#define N 1000

int main()
{
	char num_1[N]={0},num_2[N]={0},result[N]={0};          //num用来存放输入的数据,date用来计算 
	int  date_1[N]={0},date_2[N]={0},date_3[N+N]={0};      //date_3是暂存计算结果 
	int  i,j,t;
	
	printf("请输入第一个数:\n");
	gets(num_1);
	printf("请输入第二个数:\n");
	gets(num_2);
	
	//倒序赋值,把num中的数赋值到date中 
	for(i = 0;num_1[i]!='\0';i++)
	{
		date_1[strlen(num_1)-i-1] = num_1[i] - '0';
	}
	for(i = 0;num_2[i]!='\0';i++)
	{
		date_2[strlen(num_2)-i-1] = num_2[i] - '0';
	}

	//开始计算,遍历所有计算,按规律,第i个数与第j个数想乘结果是在第i+j中进行相加的 
	for(i = 0;i<strlen(num_1);i++)
	{
		for(j = 0;j<strlen(num_2);j++)
		{
			date_3[i+j] += date_1[i] * date_2[j];
		}
	}
	
	//开始进位 从0开始,对10取余进商
	for(i = 0;i<=strlen(num_1)-1+strlen(num_2)-1;i++)
	{
		date_3[i+1] += date_3[i]/10;
		date_3[i]   =  date_3[i]%10; 
	 }
		
	//把计算好的date_3数据放入字符数组
	for(i = 0;i<=strlen(num_1)+strlen(num_2)-1;i++)
	{
		result[strlen(num_1)+strlen(num_2)-1-i] = date_3[i] + '0';
	}

	//删除前面多余0
	for(i = 0;;i++)
	{
		if(result[i] != '0')
		{
			t = i;
			break;
		}
	} 
	for(;i<strlen(num_1)+strlen(num_2);i++)
	{
		result[i-t] = result[i];
	}
	result[i-t] = '\0';
	
	printf("两数相乘的结果是:\n");
	puts(result);

	
	return 0; 
	
}
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值