问题描述
输入两个整数?A?和?B,输出 A^2?B^2?的值。
输入格式
第一行输入一个整数,表示?A。
第二行输入一个整数,表示?B。
输出格式
输出仅一行,包含一个整数,表示答案。
样例输入
20
10
样例输出
300
评测数据规模
对于所有评测数据,?10^100≤A,B≤10^100。
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 2s | 256M |
C | 2s | 256M |
Java | 3s | 256M |
Python3 | 4s | 256M |
PyPy3 | 4s | 256M |
Go | 4s | 256M |
JavaScript | 4s | 256M |
//平方差
//求两个整数的平方差
//高精度运算
//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;
}
解题思路:根据评测数据范围,可知该题属于高精度运算,用数组来模拟计算过程。算平方差需要先算两个乘法,再算减法,注意高精度加减乘除法的模拟运算过程。