特殊乘法的计算

描述

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

相关推荐
IronMurphy1 小时前
【算法四十一】763. 划分字母区间
算法
cpp_25012 小时前
P2430 严酷的训练
数据结构·c++·算法·动态规划·洛谷·背包dp
Rabitebla2 小时前
【数据结构】实现通讯录:基于C语言动态顺序表
c语言·开发语言·数据结构·算法
tankeven2 小时前
动态规划专题(06):树形动态规划(未完待续)
c++·算法·动态规划
满天星83035772 小时前
【Linux/多路复用】poll和epoll的使用
linux·服务器·c++·后端
睡觉就不困鸭2 小时前
第13天 四数相加II
数据结构·哈希算法·散列表
米粒12 小时前
力扣算法刷题 Day 52
算法·leetcode·职场和发展
今儿敲了吗2 小时前
应用实战2:新闻列表
学习·算法
waves浪游2 小时前
进程间通信(上)
linux·运维·服务器·开发语言·c++