P1303 A*B Problem

在这里插入图片描述

(这道题花了我很久很久的时间,,,脑子不灵活。。)
两个数的乘法运算,说简单一点,就是将其中一个数分别用它的所有位数分别乘上另一个数,然后将这些数错位相加.

在这里插入图片描述


 贴个比较蠢得方法,不建议看,直接看下面一个。但不是我写的,是网友的,看了一下他们基本上都是那种写fa。
#include<stdio.h>
#include<string.h>
char a[10000];   
char b[10000];
char c[10000];
int main()
{
	scanf("%s", a);
	scanf("%s", b);
	int a_len = strlen(a);     //记录字符串a,b的长度
	int b_len = strlen(b);
	
	for (int i = 0; i < a_len / 2; i++)//按照惯例,翻转字符串  ,比如12345->54321
	{
		char temp;
		temp = a[i];
		a[i] = a[a_len - 1 - i];
		a[a_len - 1 - i] = temp;
	}

	for (int i = 0; i < b_len / 2; i++)//按照惯例,翻转字符串
	{
		char temp;
		temp = b[i];
		b[i] = b[b_len - 1 - i];
		b[b_len - 1 - i] = temp;
	}

	for (int i = 0; i < a_len; i++)  //将字符换数字
		a[i] -= 48;
	for (int i = 0; i < b_len; i++)
		b[i] -= 48;
	int c_count = 0;
	for (int i = 0; i < a_len; i++)
	{
		int jinzhi_add = 0;   //加法的进位
		int jinzhi_mul = 0;    //乘法的进位
		int jinzhi_sum = 0;   //总的进位,也就是加法加乘法的进位
		int z = i;
		for (int j = 0; j < b_len; z++,j++)
		{	
			int temp= (c[z] + (a[i] * b[j]) % 10 + jinzhi_sum) % 10;
			jinzhi_mul = (a[i] * b[j]) / 10;   //乘法的进位就是两个数相乘/10
			jinzhi_add = (c[z] + (a[i] *b[j]) % 10 + jinzhi_sum) / 10;     
			jinzhi_sum = jinzhi_add + jinzhi_mul;
			c[z] = temp;
		}
		while (jinzhi_sum > 0)
		{
			c[z++] = jinzhi_sum % 10;
			jinzhi_sum /= 10;
		}
		c_count = z;
	}
	if (c[c_count - 1] != 0)
		printf("%d", c[c_count - 1]);
	for (int i = c_count - 2; i >= 0; i--)
		printf("%d", c[i]);
	return 0;

}

//下面这个代码非常简洁和完美

#include<iostream>
#include<cstring>
using namespace std;
char a1[50001], b1[50001];
int a[50001], b[50001], i, x, len, j, c[50001];
int main()
{
    cin >> a1 >> b1;//读入两个数
    a[0] = strlen(a1); b[0] = strlen(b1);//计算长度
    for (i = 1; i <= a[0]; ++i)
        a[i] = a1[a[0] - i] - '0';//将字符串转换成数字
    for (i = 1; i <= b[0]; ++i)
        b[i] = b1[b[0] - i] - '0';
    for (i = 1; i <= a[0]; ++i)
        for (j = 1; j <= b[0]; ++j)
            c[i + j - 1] += a[i] * b[j];//按乘法
    len = a[0] + b[0];                                       //原理进行高精乘
    for (i = 1; i < len; ++i)
        if (c[i] > 9) 
        { 
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }//进位
    while (c[len] == 0 && len > 1)
        len--;//判断位数
    for (i = len; i >= 1; --i)
        cout << c[i];//输出
    return 0;
}

有没看懂的可以评论区发言哦。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值