特殊乘法的计算

描述

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

相关推荐
Mem0rin1 小时前
前缀和:一维与二维
数据结构·算法
小趴蔡ha1 小时前
12 K-Means 聚类入门:没有标签如何发现数据分组
算法·kmeans·聚类
鱼子星_1 小时前
【C++】stack和queue的应用及其模拟实现:适配器与容器适配器
数据结构·c++·笔记·stl
-dzk-1 小时前
【二叉树】LC 101.对称二叉树
算法·二叉树
jufeng13071 小时前
【系列:MiniKV 原理剖析 · 第 2 篇】
linux·c++·软件工程
白狐_7981 小时前
408数据结构第6章:图——核心考点、算法对比与AOE网真题
数据结构·算法
变量未定义~1 小时前
DFS之剪枝与优化-小猫爬山、 数独、 木棒
算法
Navigator_Z2 小时前
LeetCode //C - 1187. Make Array Strictly Increasing
c语言·算法·leetcode
charlie1145141912 小时前
IMX6ULL WM8960 的移植——前置介绍
开发语言·c++·开源项目·嵌入式linux
charlie1145141912 小时前
Cinux是如何管理进程的 —— 上下文与调度
开发语言·c++·操作系统·开源项目