描述
写个算法,对2个小于1000000000的输入,求结果。 特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5
输入描述:
两个小于1000000000的数
输出描述:
输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。
示例1
输入:
123 45
复制
输出:
54
cpp
#include <iostream>
using namespace std;
#include<vector>
long long ans(long long a,long long b){
vector<int> num1(10,0);
vector<int> num2(10,0);
int count1=0;
while(a!=0){
num1[count1]=a%10;
a/=10;
count1++;
}
int count2=0;
while(b!=0){
num1[count2]=b%10;
b/=10;
count2++;
}
int result=0;
for(int i=0;i<=count1;i++){
for(int j=0;j<=count2;j++){
result+=num1[i]*num2[j];
}
}
return result;
}
int main() {
long long a,b;
while(cin>>a>>b){
cout<<ans(a,b)<<endl;
}
return 0;
}
我来分析一下这个"特殊乘法"的代码实现。首先让我理解题目要求:
题目要求 :特殊乘法是将两个数的每一位数字分别相乘然后求和。
例如:123 * 45 = 1×4 + 1×5 + 2×4 + 2×5 + 3×4 + 3×5 = 4 + 5 + 8 + 10 + 12 + 15 = 54
代码分析:你提供的代码有几个问题:
- 变量名错误 :
num1[count2]=b%10;应该是num2[count2]=b%10; - 循环边界错误 :
for(int i=0;i<=count1;i++)应该是i<count1(同理j的循环) - 缺少0的处理:当输入为0时,while循环不会执行,导致结果错误
修正后的代码:
cpp
#include <iostream>
using namespace std;
#include <vector>
long long ans(long long a, long long b) {
vector<int> num1(10, 0);
vector<int> num2(10, 0);
// 处理特殊情况:如果a或b为0
if (a == 0) a = 0;
if (b == 0) b = 0;
int count1 = 0;
if (a == 0) {
num1[0] = 0;
count1 = 1;
} else {
while (a != 0) {
num1[count1] = a % 10;
a /= 10;
count1++;
}
}
int count2 = 0;
if (b == 0) {
num2[0] = 0;
count2 = 1;
} else {
while (b != 0) {
num2[count2] = b % 10; // 修正:num1改为num2
b /= 10;
count2++;
}
}
long long result = 0;
for (int i = 0; i < count1; i++) { // 修正:<=改为<
for (int j = 0; j < count2; j++) { // 修正:<=改为<
result += num1[i] * num2[j];
}
}
return result;
}
int main() {
long long a, b;
while (cin >> a >> b) {
cout << ans(a, b) << endl;
}
return 0;
}
更简洁的实现:
cpp
#include <iostream>
#include <string>
using namespace std;
long long specialMultiply(long long a, long long b) {
string s1 = to_string(a);
string s2 = to_string(b);
long long result = 0;
for (char c1 : s1) {
for (char c2 : s2) {
result += (c1 - '0') * (c2 - '0');
}
}
return result;
}
int main() {
long long a, b;
while (cin >> a >> b) {
cout << specialMultiply(a, b) << endl;
}
return 0;
}
测试验证:
- 输入:123 45
- 123的各位:1, 2, 3
- 45的各位:4, 5
- 计算:1×4 + 1×5 + 2×4 + 2×5 + 3×4 + 3×5 = 4 + 5 + 8 + 10 + 12 + 15 = 54
- 输出:54 ✓
这个算法的时间复杂度是 O(len(a) × len(b)),其中 len 表示数字的位数。