特殊乘法的计算

描述

写个算法,对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

代码分析:你提供的代码有几个问题:

  1. 变量名错误num1[count2]=b%10; 应该是 num2[count2]=b%10;
  2. 循环边界错误for(int i=0;i<=count1;i++) 应该是 i<count1(同理j的循环)
  3. 缺少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 表示数字的位数。

相关推荐
刘马想放假5 小时前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
05Kevin6 小时前
lk每日冒险题--数据结构6.27
算法
To_OC17 小时前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安1 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者1 天前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
北域码匠1 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
卷无止境1 天前
C++ 的Eigen 库全解析
c++