练习题 平方差

发布时间:2024年01月21日
题目

问题描述

输入两个整数?A?和?B,输出 A^2?B^2?的值。

输入格式

第一行输入一个整数,表示?A。

第二行输入一个整数,表示?B。

输出格式

输出仅一行,包含一个整数,表示答案。

样例输入

20
10

样例输出

300

评测数据规模

对于所有评测数据,?10^100≤A,B≤10^100

运行限制

语言最大运行时间最大运行内存
C++2s256M
C2s256M
Java3s256M
Python34s256M
PyPy34s256M
Go4s256M
JavaScript4s256M
提交代码
//平方差

//求两个整数的平方差
//高精度运算 
//A^2-B^2=(A+B)(A-B) 
//先加减后乘法 
//可能是负数->先乘法后减法 

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

string A,B;
vector<int> a,b;
vector<int> result(2000);//结果
vector<int> c1(2000);
vector<int> c2(2000); 
int cnt = 0;//结果位数 
int cnt1 = 0,cnt2 = 0;
bool isNeg = false;//是否是负数 

int main(){
	//输入A和B
	cin >> A;
	cin >> B;
	
	//-------------------------------
	
	//将A和B转换为整型数组
	//倒着存 
	for(int i = A.length() - 1;i >= 0;i--){
		if(A[i] == '-'){
			break;
		} 
		a.push_back(A[i] - '0');
	}
	for(int i = B.length() - 1;i >= 0;i--){
		if(B[i] == '-'){
			break; 
		}
		b.push_back(B[i] - '0');
	}
	
	//先计算乘法
	for(int i = 0;i < a.size();i++){
		for(int j = 0;j < a.size();j++){
			c1[i + j] += a[i] * a[j];
			c1[i + j + 1] += c1[i + j] / 10;
			c1[i + j] %= 10; 
			cnt1 = max(cnt1,i + j + 1);
		}
	}
	while(c1[cnt1] != 0){
		c1[cnt1 + 1] = c1[cnt1] / 10;
		c1[cnt1] %= 10;
		cnt1++;
	}
	
	for(int i = 0;i < b.size();i++){
		for(int j = 0;j < b.size();j++){
			c2[i + j] += b[i] * b[j];
			c2[i + j + 1] += c2[i + j] / 10;
			c2[i + j] %= 10; 
			cnt2 = max(cnt2,i + j + 1);
		}
	}
	while(c2[cnt2] != 0){
		c2[cnt2 + 1] = c2[cnt2] / 10;
		c2[cnt2] %= 10;
		cnt2++;
	}
	
	//再减法
	//判断谁大 
	if(cnt1 > cnt2){
		for(int i = 0;i < cnt1;i++){
			int t1 = c1[i];
			int t2 = c2[i];
			int j = i;
			/*int m = 10;
			while(t1 < t2){
				t1 = t1 + c1[++j] * m;
				m *= 10;
			}*/
			while(t1 < t2){
				if(c1[j + 1] == 0){
					c1[j + 1] = 9;
					j++;
				}else{
					t1 = t1 + 10;
					c1[j + 1]--;
				}
			}
			result[i] = t1 - t2;
		}
	}else if(cnt1 < cnt2){
		isNeg = true;
		for(int i = 0;i < cnt2;i++){
			int t1 = c2[i];
			int t2 = c1[i];
			int j = i;
			/*int m = 10;
			while(t1 < t2){
				t1 = t1 + c2[++j] * m;
				m *= 10;
			}*/
			while(t1 < t2){
				if(c2[j + 1] == 0){
					c2[j + 1] = 9;
					j++;
				}else{
					t1 = t1 + 10;
					c2[j + 1]--;
				}
			}
			result[i] = t1 - t2;
		}
	}else{
		int t = cnt1 - 1;
		while(t >= 0 && c1[t] == c2[t]){
			t--;
		}
		if(t == -1){
			//两数相等 
			printf("0");
			return 0;
		}else if(c1[t] > c2[t]){
			for(int i = 0;i < cnt1;i++){
				int t1 = c1[i];
				int t2 = c2[i];
				int j = i;
				/*int m = 10;
				while(t1 < t2){
					t1 = t1 + c1[++j] * m;
					m *= 10;
				}*/
				while(t1 < t2){
					if(c1[j + 1] == 0){
						c1[j + 1] = 9;
						j++;
					}else{
						t1 = t1 + 10;
						c1[j + 1]--;
					}
				}
				result[i] = t1 - t2;
			}
		}else if(c1[t] < c2[t]){
			isNeg = true;
			for(int i = 0;i < cnt2;i++){
				int t1 = c2[i];
				int t2 = c1[i];
				int j = i;
				/*int m = 10;
				while(t1 < t2){
					t1 = t1 + c2[++j] * m;
					m *= 10;
				}*/
				while(t1 < t2){
					if(c2[j + 1] == 0){
						c2[j + 1] = 9;
						j++;
					}else{
						t1 = t1 + 10;
						c2[j + 1]--;
					}
				}
				result[i] = t1 - t2;
			}
		}
	}
	
	//确认位数
	for(int i = max(cnt1,cnt2);result[i] == 0;i--){
		cnt = i;
	} 
	
	//输出结果
	if(isNeg){
		printf("-");
	}
	for(int i = cnt - 1;i >= 0;i--){
		printf("%d",result[i]);
	}
	
	return 0;
} 
总结

解题思路:根据评测数据范围,可知该题属于高精度运算,用数组来模拟计算过程。算平方差需要先算两个乘法,再算减法,注意高精度加减乘除法的模拟运算过程。

文章来源:https://blog.csdn.net/m0_64219374/article/details/135727218
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。