import java.util.Scanner;
/**
Scanner scanner = new Scanner(System.in);
String num1 = scanner.next();
String num2 = scanner.next();
System.out.println(multiply(num1,num2));
} num1 = new StringBuilder(num1).reverse().toString();
num2 = new StringBuilder(num2).reverse().toString();
// even 99 * 99 is < 10000, so maximaly 4 digits
int[] d = new int[num1.length() + num2.length()];
for (int i = 0; i < num1.length(); i++) {
int a = num1.charAt(i) - '0';
for (int j = 0; j < num2.length(); j++) {
int b = num2.charAt(j) - '0';
d[i + j] += a * b;
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < d.length; i++) {
int digit = d[i] % 10;
int carry = d[i] / 10;
sb.insert(0, digit);
if (i < d.length - 1)
d[i + 1] += carry;
}
//trim starting zeros
while (sb.length() > 0 && sb.charAt(0) == '0') {
sb.deleteCharAt(0);
}
return sb.length() == 0 ? "0" : sb.toString();
}import sys s=sys.stdin.readline().strip().split() def karatsuba_mul(num1, num2): #karatsuba算法 if len(str(num1))==1 or len(str(num2))==1: return num1*num2 n=max(len(str(num1)),len(str(num2))) half=n//2 a=num1//10**half b=num1%10**half c=num2//10**half d=num2%10**half ac=karatsuba_mul(a,c) #计算a*c bd=karatsuba_mul(b,d) #计算b*d abcd=karatsuba_mul(a+b,c+d) #计算(a+b)*(c+d) adbc=abcd-ac-bd return ac*10**(2*half)+adbc*10**half+bd print(str(karatsuba_mul(int(s[0]), int(s[1]))))
import java.util.Scanner;
/**
* @author wylu
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
char[] s1 = scanner.next().toCharArray();
char[] s2 = scanner.next().toCharArray();
int len = s1.length + s2.length;
char[] res = new char[len];
for (int i = 0; i < len; i++) res[i] = '0';
for (int i = s1.length - 1; i >= 0; i--) {
int cur = s1.length - i - 1, multiplier = s1[i] - '0', carry = 0;
for (int j = s2.length - 1; j >= 0; j--) {
int product = (res[cur] - '0') + multiplier * (s2[j] - '0') + carry;
res[cur++] = (char) (product % 10 + '0');
carry = product / 10;
}
if (carry != 0) res[cur] = (char) (carry + '0');
}
int i = len - 1;
while (i >= 0 && res[i] == '0') i--; //忽略前导0
if (i < 0) {
System.out.println(0);
}else {
for (; i >= 0; i--) System.out.print(res[i]);
System.out.println();
}
}
}
}
#include <iostream>
#include <cstring>
int multi(const char* lhs, const char* rhs, char* result) {
if (lhs == NULL || rhs == NULL || result == NULL)
return 0;
int llen = strlen(lhs), rlen = strlen(rhs);
if (llen == 0 || rlen == 0)
return 0;
// 用rhs每一位去乘lhs,模拟手工算乘法的过程。
int length = llen + rlen - 1;
for (int j = rlen - 1; j >= 0; j--) {
int carry = 0; // 乘法进位
for (int i = llen - 1; i >= 0; i--) {
int temp = (rhs[j] - '0') * (lhs[i] - '0') + carry;
// 根据位偏移将本位的结果加到result中去并处理加法进位。(result为倒序)
int bit = llen - i - 1 + (rlen - j - 1);
if ((result[bit] += temp % 10) >= '0' + 10) {
result[bit + 1] += (result[bit] - '0') / 10;
result[bit] = (result[bit] - '0') % 10 + '0';
}
// 保留进位。
carry = temp / 10;
}
// 最高位有进位
if (carry > 0) {
result[llen + (rlen - j - 1)] += carry;
length++;
}
}
// 去掉多余的0
while (result[length - 1] == '0')
length--;
return length;
}
int main() {
char a[999];
char b[999];
scanf("%s%s", a, b);
char r[999999];
memset(r, '0', sizeof(r));
int length = multi(a, b, r);
while (--length >= 0) {
std::cout << r[length];
}
system("pause");
return 0;
} # coding=utf-8
def fun(l):
num0,num1 = l[0],l[1]
result = 0
# 还原乘法的过程,按位相乘再乘以位数权重
for i in range(len(num0)):
for j in range(len(num1)):
# 注意计算位数权重时,index越大位数越小
result += int(num0[i])*int(num1[j])*pow(10,len(num0)-1-i+len(num1)-1-j)
return (str(result))
if __name__=='__main__':
s = raw_input()
l = s.split(' ')
print(fun(l))
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
private static String add(String n1, String n2) {
StringBuilder res = new StringBuilder();
int p1 = n1.length() - 1;
int p2 = n2.length() - 1;
int carry = 0;
while (carry > 0 || p1 >= 0 || p2 >= 0) {
int value = carry + (p1 >= 0 ? n1.charAt(p1) - '0' : 0) + (p2 >= 0 ? n2.charAt(p2) - '0' : 0);
res.append(value % 10);
carry = value / 10;
if (p1 >= 0) p1--;
if (p2 >= 0) p2--;
}
return res.reverse().toString();
}
private static String singleMul(String n1, char n2) {
StringBuilder res = new StringBuilder();
int p = n1.length() - 1;
int carry = 0;
while (carry > 0 || p >= 0) {
int value = carry + (n2 - '0') * (p >= 0 ? n1.charAt(p) - '0' : 0);
res.append(value % 10);
carry = value / 10;
if (p >= 0) p--;
}
return res.reverse().toString();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String n1 = scanner.next();
String n2 = scanner.next();
if (n1.length() < n2.length()) {
String tmp = n1;
n1 = n2;
n2 = tmp;
}
List<String> sums = new ArrayList<>();
for (int i = n2.length() - 1; i >= 0; i--) {
sums.add(singleMul(n1, n2.charAt(i)) + new String(new char[n2.length() - 1 - i]).replace('\0', '0'));
}
String res = "0";
for (String s : sums) {
res = add(res, s);
}
System.out.println(res);
}
}
运行时间:74ms
占用内存:11272k
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string num1, num2;
string s = "";
cin >> num1 >> num2;
int len1 = num1.size();
int len2 = num2.size();
vector<int> vTemp(len1 + len2 - 1);
int n1, n2;
for (int i = 0; i<len1; i++)
{
n1 = num1[i] - '0';
for (int j = 0; j <len2; j++)
{
n2 = num2[j] - '0';
vTemp[i + j] += n1*n2;
}
}
int carry = 0;
int tmp;
for (int i = vTemp.size()-1; i >= 0; i--)
{
tmp = vTemp[i] + carry;
vTemp[i] = tmp % 10;
s = to_string(vTemp[i])+s;
carry = tmp / 10;
}
if(carry > 0)
s = to_string(carry)+s;
cout << s << endl;
return 0;
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] strNum = br.readLine().trim().split(" ");
System.out.println(multiply(strNum[0].toCharArray(), strNum[1].toCharArray()));
}
// 模拟乘法竖式
private static String multiply(char[] num1, char[] num2) {
if(num1.length < num2.length){
char[] temp = num1;
num1 = num2;
num2 = temp;
}
Stack<String> stack = new Stack<>();
for(int j = num2.length - 1; j >= 0; j--){
StringBuilder sb = new StringBuilder();
// 之后做竖式加法要补0
for(int k = 0; k < num2.length - 1 - j; k++) sb.append(0);
int carry = 0;
for(int i = num1.length - 1; i >= 0; i--){
int num = (num1[i] - '0')*(num2[j] - '0') + carry;
carry = num / 10;
sb.append(num % 10);
}
if(carry > 0) sb.append(carry);
if(stack.isEmpty())
stack.push(sb.reverse().toString());
else{
String temp = stack.pop();
stack.push(add(temp, sb.reverse().toString()));
}
}
return stack.pop();
}
private static String add(String num1, String num2) {
if(num1.length() < num2.length()){
String temp = num1;
num1 = num2;
num2 = temp;
}
int len1 = num1.length();
int len2 = num2.length();
int i = len1 - 1, j = len2 - 1;
int carry = 0;
StringBuilder sb = new StringBuilder();
while(i >= 0 && j >= 0){
int num = (num1.charAt(i) - '0') + (num2.charAt(j) - '0') + carry;
carry = num / 10;
sb.append(num % 10);
i--;
j--;
}
while(i >= 0){
int num = (num1.charAt(i) - '0') + carry;
carry = num / 10;
sb.append(num % 10);
i--;
}
if(carry > 0) sb.append(carry);
return sb.reverse().toString();
}
} #include <bits/stdc++.h>
using namespace std;
int main(){
string s1, s2;
cin>>s1>>s2;
int n=s1.size(), m=s2.size(), k;
string r(n+m,'0');
for(int i=n-1;i>=0;i--){
int c = 0;
for(int j=m-1;j>=0;j--){
int t = (r[i+j+1]-'0') + (s1[i]-'0')*(s2[j]-'0') + c;
r[i+j+1] = t%10 + '0';
c = t/10;
}
r[i] += c;
}
for(k=0;k<r.size();k++)
if(r[k]!='0')
break;
r = r.substr(k);
cout<<r<<endl;
return 0;
} from functools import reduce def multiply(num1, num2): n1, n2 = len(num1), len(num2) if n1 < n2: num1, num2, n1, n2 = num2, num1, n2, n1 res = [] for j in range(n2 - 1, -1, -1): tmpRes = '' carry = 0 for i in range(n1 - 1, -1, -1): tmp = int(num1[i]) * int(num2[j]) + carry tmpRes = str(tmp % 10) + tmpRes carry = tmp // 10 tmpRes = str(carry) + tmpRes if carry != 0 else tmpRes if int(tmpRes) != 0: tmpRes += (n2 - j - 1) * '0' else: tmpRes = '0' res.append(tmpRes) return reduce(addStrings, res) if len(res) > 1 else res[0] def addStrings(num1, num2): i, j, res = len(num1) - 1, len(num2) - 1, '' carry = 0 while i >= 0&nbs***bsp;j >= 0&nbs***bsp;carry: c1 = int(num1[i]) if i >= 0 else 0 c2 = int(num2[j]) if j >= 0 else 0 tmp = c1 + c2 + carry carry = tmp // 10 res = str(tmp % 10) + res i, j = i - 1, j - 1 return res a, b = input().split() print(multiply(a, b))
import java.math.BigDecimal;
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner (System.in);
String s1=cin.next();
String s2=cin.next();
BigDecimal b1=new BigDecimal(s1);
BigDecimal b2=new BigDecimal(s2);
BigDecimal b3=b1.multiply(b2);
String s3=String.valueOf(b3);
System.out.print(s3);
}
} #include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
void output(vector<int> v)
{
for (auto ele : v)
{
cout << ele;
}
putchar(10);
}
vector<int> mul(string x, string y)
{
vector<int> res(x.length() + y.length(), 0);
reverse(x.begin(), x.end());
reverse(y.begin(), y.end());
//先乘,不用考虑进位,int范围21亿,10以内的乘法,可以存2千万次
for (int i = 0; i < x.length(); i++)
{
for (int j = 0; j < y.length(); j++)
{
//和x的第一位数乘,结果从res[0]开始保存,和x的第二位数乘,结果从res[1]开始保存,以此类推
res[i + j] += (x[i] - '0') * (y[j] - '0');
}
}
//最后一次性进位
for (int i = 0; i < res.size() - 1; i++)
{
res[i + 1] += res[i] / 10;
res[i] %= 10;
}
//3 * 3 = 9,但是申请了2个int的vector,最后一个int没有进位,pop掉
while (res.back() == 0)
{
res.pop_back();
}
//逆置就是结果了
reverse(res.begin(), res.end());
return res;
}
int main()
{
string x, y;
while (cin >> x >> y)
{
output(mul(x, y));
}
return 0;
} import java.util.Scanner;
import java.util.ArrayList;
import java.lang.Math;
public class Main{
public static String add(String s1,String s2){
int len1=s1.length();
int len2=s2.length();
int pad=Math.abs(len1-len2);
String padding="";
for(int i=0;i<pad;i++){
padding=padding+"0";
}
if(len1>len2){
s2=padding+s2;
}else{
s1=padding+s1;
}
int len=s1.length();
String ans="";
int c=0;
for(int j=len-1;j>=0;j--){
int a=s1.charAt(j)-'0';
int b=s2.charAt(j)-'0';
int v=(a+b+c)%10;
c=(a+b+c)/10;
ans=v+ans;
}
if(c>0){
ans=c+ans;
}
return ans;
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s1=sc.next();
String s2=sc.next();
int len1=s1.length();
int len2=s2.length();
ArrayList<String> tmp=new ArrayList<>();
for(int i=len2-1;i>=0;i--){
String ans="";
int v=s2.charAt(i)-'0';
for(int j=0;j<v;j++){
ans=add(ans,s1);
}
int pad=len2-1-i;
String padding="";
for(int l=0;l<pad;l++){
padding=padding+"0";
}
ans=ans+padding;
tmp.add(ans);
}
String result="";
for(String s:tmp){
result=add(result,s);
}
System.out.println(result);
}
}
} /*很朴素的代码*/
#include <iostream>
#include<string>
using namespace std;
int main()
{
string str1,str2;
cin>>str1>>str2;
int s1=str1.size();
int s2=str2.size();
int *result=new int[s1+s2];
for(int i=0;i<s1+s2;i++)
{
result[i]=0;
}
for(int i=s1-1;i>=0;i--)
{
int carry=0;
for(int j=s2-1;j>=0;j--)
{
int temp=(str1[i]-'0')*(str2[j]-'0')+result[i+j+1]+carry;
result[i+j+1]=temp%10;
carry=temp/10;
if(j==0)
result[i]+=carry;
}
}
int i = 0;
while (result[i] == 0)
i++;
string s;
for(i;i<s1+s2;i++)
s+=result[i]+'0';
cout<<s<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
string sum;
string multi(string str1, int num) {
string tmp;
int forward = 0;
for (int i = str1.size() - 1; i >= 0; i--) {
int s = num * (str1[i] - '0') + forward;
tmp.insert(tmp.begin(), (s % 10) + '0');
forward = s / 10;
}
if (forward)
tmp.insert(tmp.begin(), forward + '0');
return tmp;
}
string add(string s1, string s2) {
int i = s1.size() - 1;
int j = s2.size() - 1;
int forward = 0;
string tmp;
while (i >= 0 && j >= 0) {
int s = (s1[i] - '0') + (s2[j] - '0') + forward;
tmp.insert(tmp.begin(), (s % 10) + '0');
forward = s / 10;
i--; j--;
}
while (i >= 0) {
int s = (s1[i] - '0') + forward;
tmp.insert(tmp.begin(), (s % 10) + '0');
forward = s / 10;
i--;
}
while (j >= 0) {
int s = (s2[j] - '0') + forward;
tmp.insert(tmp.begin(), (s % 10) + '0');
forward = s / 10;
j--;
}
if (forward)
tmp.insert(tmp.begin(), forward + '0');
return tmp;
}
int main(int argc, char const *argv[])
{
string str1, str2;
cin >> str1 >> str2;
sum.clear();
int flag = 1;
//cout << "debug " << add("12", "12") << endl;
for (int i = str2.size() - 1; i >= 0; i--) {
string tmp = multi(str1, str2[i] - '0');
//cout << tmp << endl;
if (sum.empty())
sum = tmp;
else {
//cout << "add is " << add(tmp, sum.substr(0, sum.size() - 1)) << endl;
sum = add(tmp, sum.substr(0, sum.size() - flag)) + sum.substr(sum.size() - flag);
flag++;
//cout << "sum is " << sum << endl;
}
}
cout << sum;
return 0;
}
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Solution {
public:
//参照二楼思路做了修正
//基本思路:首先,两个整数相乘可以分为两步。第一步,不考虑进位,两个整数相乘后,得到很多列
// ,然后每列的和都依次存入数组c中。其次,从右往左看,后一列的和还需要加上前一列的
// 和的十进制位,而前一列需要变成它的和的余数。最后,只需将数组c依次拼接即可得所求。
void bigIntegerMultiplying(string a,string b) {
int len1=a.size();
int len2=b.size();
vector<int> c(len1+len2+1);
int num1,num2;
for(int i=0; i<len1; ++i) {
num1=a[len1-1-i]-'0';
for(int j=0; j<len2; ++j) {
num2=b[len2-1-j]-'0';
c[i+j]+=num1*num2;
}
}
string str="";
char s;
for(int i=0; i<len1+len2; ++i) {
c[i+1]+=c[i]/10;//加进位
c[i]=c[i]%10; //变余数
s=c[i]+'0';
if(i==len1+len2-1&&!c[i])//过滤最高位可能为0的情况
continue;
str=s+str;//反向拼接
}
cout<<str;
}
};
int main() {
string str1,str2;
cin>>str1>>str2;
Solution s;
s.bigIntegerMultiplying(str1,str2);
return 0;
}
为什么我这个在自己电脑上可以 在这就不行呢???? 有没有大神帮我看看