我有一个项目(学校),我绝对不能使用任何外部库,因此不能使用任何大数字库,我需要得到2(非常)大数的产品。所以我认为我实际上会为它编写自己的代码,但我似乎无法通过单位数乘法。
到目前为止我是如何做到的,我有一系列字符'a'。并且Ill将其每个数字乘以另一个数字(因为没有乘法可以超过81,即9 * 9)。但我似乎无法弄清楚Ill是如何将两个数组相互加倍的。
如同,
int a[] = {1,2,3};
int b[] = {4,5,6};
int r[200]; // To store result of 123x456. After processing should have value 56088
到目前为止我的代码......
#include <iostream>
using namespace std;
void reverseArray(int array[], int n)
{
int t;
for(int i=0;i<n/2;i++)
{
t = array[i];
array[i] = array[n-i-1];
array[n-i-1] = t;
}
}
int main()
{
int A[] = {1,2,6,6,7,7,8,8,8,8,8,8,8,8,8,8};
int s = sizeof(A)/sizeof(int);
int n = s-1;
int R[50];
int x = 2;
int rem = 0;
for(int i=0; i<s; i++)
{
R[i] = (A[n-i] * x) % 10;
R[i] += (rem != 0) ? rem:0;
rem = (A[n-i] * x) / 10;
}
reverseArray(R, s);
for(int i=0; i<s; i++) cout<<R[i]; // Gives 2533557777777776
}
我还发现了一个类似的程序here来计算非常大数的阶乘。但我似乎无法理解代码足以根据我的需要改变它。
对不起,如果问题有点粗略。
感谢。
答案 0 :(得分:1)
就像你现在做的一样,但对于第二个数组中的每个数字 - 换句话说,而不是x
使用B[j]
,其中j
是一个循环覆盖数组B
中的所有数字。
答案 1 :(得分:1)
我不确定你在小学学到了什么算法来乘以两个任意数字,但在视觉上它是这样的:
43241
621
----- *
43241 <-- 1 * 43241
864820 <-- 20 * 43241, basically do 2 * 43241 and append a zero
25944600 <-- 600 * 43241, basically do 6 * 43241 and append two zeroes
-------- +
26852661 <-- Add up results, remember to carry
因此,在此特定示例中,数组将为A[] = {1,4,2,3,4}
和B[] = {1,2,6}
。然后你可以做一个for循环,比如
int tempArray[50]; // something big enough
for (int n = 0; n < max; n++)
{
multiplyArrayWithNumber(A, B[i], tempArray, i);
addArraysAndStore(resultArray, tempArray, resultArray);
}
其中函数multiplyArrayWithNumber
和addArraysAndStore
可能具有签名
void multiplyArrayWithNumber(const int* array, const int number, int* resultArray, const int zeroesAppended);
void addArraysAndStore(const int* lefthandside, const int* righthandside, int* result);
答案 2 :(得分:1)
我已经在java中完成了,在这里我将数字N1和N2,我创建了一个大小为1000的数组。让我们举一个例子如何解决这个问题, N1 = 12,N2 = 1234。 对于N1 = 12,temp = N1%10 = 2,现在将该数字从右到左乘以数字N2并将结果存储到从i = 0开始的数组中,类似于N1的剩余数字。数组将以相反的顺序存储结果。看看这个链接。 http://ideone.com/UbG9dW#view_edit_box
//Product of two very large number
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
class Solution {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int N1=scan.nextInt();
int N2=scan.nextInt();
//int N=scan.nextInt();
int [] array=new int[1000];
Arrays.fill(array,0);
int size=multiply(N1,N2,array);
for(int i=size-1;i>=0;i--){
System.out.print(array[i]);
}
}
public static int multiply(int N1, int N2, int [] result){
int a=N1;
int b=N2;
int count=0, carry=0;
int i=0;
int max=0;
if(a==0||b==0)
return 1;
while(a>0){
int temp1=a%10;
a=a/10;
i=0;
while(b>0){
int temp2=b%10;
b=b/10;
int product=result[count+i]+temp1*temp2+carry;
result[count+i]=product%10;
carry=product/10;
i++;
//System.out.println("ii="+i);
}
while(carry>0){
result[count+i]=carry%10;
carry=carry/10;
i++;
//System.out.println("iiii="+i);
}
count++;
b=N2;
}
//System.out.println("i="+i);
return i+count-1;
}
}