首页 > 试题广场 >

特殊乘法

[编程题]特殊乘法
  • 热度指数:29820 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
写个算法,对2个小于1000000000的输入,求结果。 特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5

输入描述:
两个小于1000000000的数


输出描述:
输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。
示例1

输入

123 45

输出

54

这是笛卡尔积的运算,在python中天然支持,在itertools包中有product方法。
代码如下,测试已通过:

from itertools import product
while True:
    try:
        a, b = input().split()
        res = 0
        for i in product(map(int, list(a)), map(int, list(b))):
            res += i[0] * i[1]
        print(res)
    except:
        break
编辑于 2017-09-08 11:11:46 回复(1)
from itertools import product
try:
    while 1:
        a, b = raw_input().split()
        print sum(map(lambda x:int(x[0]) * int(x[1]), list(product(a,b))))
except:
    pass

发表于 2016-12-23 23:57:52 回复(0)
蛮力法,关键在于用long类型,先求输入的两个的数的长度,然后在再给一个数组保存他们每一位的值,然后直接求对应结果。


import java.util.Scanner;
public  class Main{
    public static int lengthNumber(long number){
        int length=0;
        while(number!=0){
            number=number/10;
            length++;
        }
        return length;
    }
    public static long methon(long number1,long number2){
        int length1=lengthNumber(number1);
        int length2=lengthNumber(number2);
        long []array=new long[length1];
        long []array2=new long [length2];
        int i=0;
        int j=0;
        int sum=0;
        while(number1!=0){
            array[i]=number1%10;
            number1/=10;
            i++;
        }
        while(number2!=0){
            array2[j]=number2%10;
            number2/=10;
            j++;
        }
        for(int k=0;k<length1;k++){
            for(int z=0;z<length2;z++){
                sum+=array[k]*array2[z];
            }
        }
        
        return sum;
    }
    
    public static void main(String []args){
        Scanner scanner=new Scanner(System.in);
        long number1,number2;
        number1=scanner.nextLong();
        number2=scanner.nextLong();
        System.out.println(methon(number1,number2));
    }
}
发表于 2021-03-18 20:28:38 回复(0)
关键点:模10以取出个位,除/10可以去除个位。注意取模后会改变原来的值,所以要提前存储下来。
#include <iostream>
//模10以取出个位,除/10可以去除个位
long int fun(long int x,long int y)
{
    long int ans=0,y1;
     while(y)
    {
        y1=y;
        y1=y%10;
        ans+=x*y1;
        y=y/10;
    }
   return ans;
}

int main(void)
{
    long int x,y,ans1=0,x1;
    std::cin>>x>>y;
   while(x)
   {
       x1=x;
       x1%=10;
       ans1+=fun(x1,y);
       x/=10;
   }
    std::cout<<ans1<<std::endl;
return 0;
}


发表于 2021-03-02 18:33:09 回复(0)
#include <iostream>
#include <string>

using namespace std;

int main() {
    string str1,str2;
    int n = 0;
    while ( cin >> str1 >> str2 ) {
        for ( int i = 0 ; i < str1.size() ; i++ )
            for ( int j = 0 ; j < str2.size() ; j++ )
                n += (str1[i]-'0') * (str2[j]-'0');
        cout << n << endl;
    }
    return 0;
}

发表于 2021-01-29 10:18:07 回复(0)
#include<iostream>
#
include<string>
using namespace std;
int main(){
    string s1,s2;
    cin>>s1>>s2;
    int sum=0;
    for(int i=0;i<s1.length();i++){
        for(int j=0;j<s2.length();j++){
            sum+=(s1[i]-48)*(s2[j]-48);
            //char类型转化为int类型,1的ASCII码为49 
        }
    }
    cout<<sum;
    return 0;
}

发表于 2020-03-14 10:05:45 回复(0)
Java解法
import java.util.Scanner;

public class Main02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] s = scanner.nextLine().split(" ");
        char[] x = s[0].toCharArray();
        char[] y = s[1].toCharArray();
        int sum=0;
        for (char x1 : x) {
            for (char y1 : y) {
                sum += (x1-'0') * (y1-'0');
            }
        }
        System.out.println(sum);
    }
}



编辑于 2020-03-06 22:29:55 回复(0)
根据 贾林鹏 同学与王道书的指引启发,相对一个个取数字要简化一些,不过复杂度应该还是n2级的
#include<iostream>
#include<cstdio>

using namespace std;

int main(){
    string n1,n2;
    int result = 0;
    while(cin>>n1>>n2){
        for(int i=0; i<n1.length(); i++){
            for(int j=0; j<n2.length(); j++){
                result += (n1[i]-'0')*(n2[j]-'0');//关键,char2int
            }
        }
        cout<<result<<endl;
    }
    return 0;
}

发表于 2020-02-14 17:30:07 回复(0)
#include<iostream>
#include<cmath>
using namespace std;
int main() {
    int a, b;
    while (cin >> a >> b) {
        bool judge_a = 0, judge_b = 0;
        int a_max = 1, b_max = 1;
        for (int i = 1; i <= 9; i++) {
            if (pow(10, a_max)>a) {
                judge_a = 1;
                a_max--;
            }
            if (pow(10, b_max)>b) {
                judge_b = 1;
                b_max--;
            }
            if (judge_a == 1 && judge_b == 1)
                break;
            a_max++;
            b_max++;
        }
        int result = 0;
        for (int i = 0; i <= a_max; i++) {
            int temp_a = (a % (int)pow(10, i + 1)) / (int)pow(10, i);
            for (int j = 0; j <= b_max; j++) {
                int temp_b = (b % (int)pow(10, j + 1)) / (int)pow(10, j);
                result += temp_b*temp_a;
            }
        }
        cout << result << endl;
    }
}

发表于 2019-02-05 17:04:03 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String a = in.next();
            String b = in.next();
            int sum=0;
            for(int i=0;i<a.length();i++){
                for(int j=0;j<b.length();j++){
                    sum = sum + (a.charAt(i) - '0') * (b.charAt(j) - '0');
                }
            }
            System.out.println(sum);
        }
    }
}

发表于 2018-02-26 14:22:41 回复(0)
#include<stdio.h>
int main()
{
    char a[11],b[11];
    int n,i,j;
    while(scanf("%s%s",a,b)!=EOF)
    {
        i=0;
        j=0;
        n=0;
        while(a[i]!='\0')
            {
                j=0;
                while(b[j]!='\0')
        {
            n+=(a[i]-48)*(b[j]-48);
            j++;
        }
        i++;
    }
    printf("%d\n",n);
    }
    return 0;
}

发表于 2018-02-25 15:37:13 回复(0)
#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
    int A,B,sum=0,a[10]={0},b[10]={0};
    while(cin>>A&&cin>>B){
        int i=0,j=0;
        while(A>=10){
            a[i]=A%10;
            i++;
            A/=10;
        }
        a[i]=A;
        while(B>10){
            b[j]=B%10;
            j++;
            B/=10;
        }
        b[j]=B;
        for(int n=0;n<=i;n++)
            for(int m=0;m<=j;m++){
            sum+=a[n]*b[m];
        }
		cout<<sum<<endl;
        sum=0;
    }
    return 0;
}

发表于 2016-04-29 16:40:21 回复(0)
#include<iostream>
#include<cstdio>
using namespace std;

int main()
{
    string str1, str2;
    while(cin >> str1 >> str2)
    {
        int sum = 0;
        for(int i = 0; i < str1.length(); ++i)
        {
            for(int j = 0; j < str2.length(); ++j)
            {
                sum += (str1[i]-'0')*(str2[j]-'0');
            }
        }

        cout << sum << endl;
    }

    return 0;
}


发表于 2016-08-01 10:45:33 回复(5)
两种方法 数位拆解法和简单转换法

#include <stdio.h>
int main()
{
    char a[12],b[12];
    while(scanf("%s %s",a,b)!=EOF)
    {
        int ans=0;
        for(int i=0;a[i]!=0;++i)
            for(int j=0;b[j]!=0;++j)
                ans+=(a[i]-'0')*(b[j]-'0');
        printf("%d\n",ans);
    }
    return 0;
}

运行时间:3ms
占用内存:384k
运行时间:2ms
占用内存:384k

#include <stdio.h>
//#include <string.h>
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF)
    {
        int buf1[100]={0},buf2[100]={0};
        int size1=0,size2=0;//千万记得要每个变量分别初始化!!!
        while(a){
            buf1[size1++]=a%10;
            a/=10;
        }
        while(b){
            buf2[size2++]=b%10;
            b/=10;
        }
        int ans=0;
           for(int i=0;i<size1;i++)
            for(int j=0;j<size2;j++)
                ans+=buf1[i]*buf2[j];
        //for(int k=0;buf1[k]!=0;++k)
            //for(int m=0;buf2[m]!=0;++j)
                
        printf("%d\n",ans);
    }
    return 0;
}
运行时间:2ms
占用内存:384k
运行时间:2ms
占用内存:264k
发表于 2018-01-16 17:44:35 回复(1)
123 (*) 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5 = (1+2+3) * (4+5)
类比可知该特殊乘法的结果等于两数各位数字之和的乘积
#include <cstdio>

int main () {
    int a = 0, b = 0; char c;
    while (' ' != (c = getchar()))
        a += c - '0';
    while (' ' <= (c = getchar()))
        b += c - '0';
    printf("%d", a * b);
}

发表于 2020-02-18 02:21:28 回复(3)
#include<stdio.h>
int main (int argc, char *argv[]){
    int a,b,res,ta,tb;
    for(;~scanf("%d %d",&a,&b);){
        for(res=0,ta=a;ta>0;ta/=10)
            for(tb=b;tb>0;tb/=10)
                res += (ta%10)*(tb%10);
        printf("%d\n",res);
    }
}

发表于 2018-01-11 20:19:49 回复(0)
//输入字符串,把输入的字符串转化成整形数组,然后相乘
#include<stdio.h>
(737)#include<string.h>
int main()
{
    char c1[11],c2[11];//数字可能太大int装不下所以用char
    int a1[11],a2[11];
    scanf("%s",c1);scanf("%s",c2);
    int n1,n2,i,j,sum=0;
    n1=strlen(c1);n2=strlen(c2);
    //字符数组变成整形数组
    for(i=0;i<n1;i++)
        {a1[i]=c1[i]-'0';}
    for(i=0;i<n2;i++)
        {a2[i]=c2[i]-'0';}
    //两个数组各个位置相乘累加
    for(i=0;i<n1;i++)
        for(j=0;j<n2;j++)
            sum+=a1[i]*a2[j];
    printf("%d",sum);
}

发表于 2020-03-20 20:54:22 回复(0)
 //求类似123*45=1*4+1*5+2*4+2*5+3*4+3*5的结果
//输入两个数,输出特殊乘法的结果
#include<iostream>
using namespace std;

int main()
{
    int x,y;
    int tempx,tempy;
    while(cin>>x>>y)
    {
        tempx = 0;
        tempy = 0;
        while(x)
        {
            tempx += x%10;
            x /= 10;
        }
        while(y)
        {
            tempy += y%10;
            y /= 10;
        }
        int ans = tempx *tempy;
        cout<<ans<<endl;
    }
    return 0;
} 
因为最终的计算结果相当于将每个数字上的值相加得到的结果再相乘,所以最终的时间复杂度为O(m+n),m、n为两个数字的位数。
特殊乘法A1A2…Am * B1B2…Bn = A1*B1+A1*B2+…A1*Bn+…Am*B1+Am*B2+…Am*Bn = A1*(B1+B2+…Bn+A2*(B1+B2+…Bn+…+Am*(B1+B2+…Bn = (A1+A2…+Am)*(B1+B2+…Bn
发表于 2018-04-09 16:38:22 回复(1)

C++ 数字转字符串处理

思路:
1. 如果直接用数来计算,还需要对原数进行拆分,个位十位百位等等,很麻烦。转化成字符串的话,可直接使用string的size函数确定,并且按照一维数组进行访问。
2. 解决访问字符串数组时是单个char字符的问题,可直接对字符进行减 字符‘0’操作,根据ANSI表可明白此操作。
这样就基本解决问题了。

#include <iostream>
#include <string>

using namespace std;

int main(){
    string x,y;
    while(cin>>x>>y){
        int ans=0;
        for(int i=0;i<x.size();i++){
            for(int j=0;j<y.size();j++){
                ans+=(x[i]-'0')*(y[j]-'0');
            }
        }
        cout<<ans;
    }
    return 0;
}


发表于 2022-02-11 17:34:08 回复(1)
#include<stdio.h>
int main(){
    int a,b,m,n,sum1,sum2;
    while(~scanf("%d %d",&a,&b))
    {
        m=0,n=0,sum1=0,sum2=0;
        while(b>0){
            sum1+=b%10;
            b/=10;
            }
        while(a>0)
        {
            m=a%10;
            a/=10;
            sum2+=m*sum1;
        }printf("%d\n",sum2);
    }
}

发表于 2021-12-26 23:33:39 回复(0)