特殊乘法的计算

描述

写个算法,对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 表示数字的位数。

相关推荐
浅念-1 小时前
递归解题指南:LeetCode经典题全解析
数据结构·算法·leetcode·职场和发展·排序算法·深度优先·递归
Kiling_07041 小时前
Java集合进阶:Set与Collections详解
算法·哈希算法
智者知已应修善业2 小时前
【51单片机89C51及74LS273、74LS244组成】2022-5-28
c++·经验分享·笔记·算法·51单片机
洛水水2 小时前
【力扣100题】33.验证二叉搜索树
算法·leetcode·职场和发展
SimpleLearingAI2 小时前
聚类算法详解
算法·数据挖掘·聚类
刀法如飞3 小时前
Go 字符串查找的 20 种实现方式,用不同思路解决问题
算法·面试·程序员
Byron Loong5 小时前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
Dlrb12115 小时前
C语言-指针数组与数组指针
c语言·数据结构·算法·指针·数组指针·指针数组·二级指针
WL_Aurora5 小时前
Python 算法基础篇之集合
python·算法
坚果派·白晓明5 小时前
【鸿蒙PC三方库移植适配框架解读系列】第一篇:Lycium C/C++ 三方库适配 — 概述与环境配置
c语言·开发语言·c++·harmonyos·开源鸿蒙·三方库·c/c++三方库