我正在尝试为非常大的数字(甚至比长的数字大)制作计算器,并且我正在使用数组来使其工作.
到目前为止,我已经完成了加法,减法和乘法.但我真的被困在分区.
编辑:新进展.作为一个朋友提到我需要每次将结果数组与除数进行比较,这样我可以在任何时候除数大于被除数时停止进度.我设法做了一个很好的功能来每次比较它.此功能单独测试,工作正常.好.现在我开始取得真正的进步.我得到了商.现在我将尝试在数组中放置商,以便我们可以使用更大的数字!
#define MAX_SIZE 50
#define SIZE_USE (MAX_SIZE-1)
int div(int inum_first[], int inum_second[], int div_result[], int firstlen, int secondlen)
{
int i;
int check1 = 0, check2 = 0;
int zeroC = 0;
int tmp[MAX_SIZE];
for (i = 0; i <= SIZE_USE; i++)
{
tmp[i] = 0;
}
int inum_firstCP[MAX_SIZE] = { 0 };
for (i = 0; i <= 1; i++)
{
inum_firstCP[i] = inum_first[i]; // create a copy of inum_first
}
for (i = 0; i <= SIZE_USE; i++)
{
if (inum_first[i] != 0)
check1++;
if (inum_second[i] != 0)
check2++;
}
if (secondlen > firstlen)
{
zeroC++;
goto EOI;
}
if (check2 == 0)
{
puts("\nExpected error\n");
return -1;
}
int j = 0, p = 0;
int s = 0;
int o = 1; // o is Quotient!
do
{
for (i = SIZE_USE; i >= 0; i--)
{
if (tmp[i] = inum_firstCP[i] - inum_second[i] >= 0)
{
tmp[i] = inum_firstCP[i] - inum_second[i];
}
else
{
inum_firstCP[i - 1] = inum_firstCP[i - 1] - 1;
tmp[i] = (inum_firstCP[i] + 10) - inum_second[i];
}
inum_firstCP[i] = tmp[i];
}
if (compare(inum_firstCP, inum_second, firstlen, secondlen) < 0) break;
j++;
o++;
} while (j<MAX_SIZE); // anything else will also work
EOI:
return 0;
}
int compare(int inum_firstCP[], int inum_second[], int firstlen, int secondlen)
{
int c = 0, d = 0;
int i;
firstlen = MAX_SIZE, secondlen = MAX_SIZE; // temporary. will provide a better solution ASAP
if (firstlen > secondlen)
{
return 1;
}
else if (secondlen > firstlen)
{
return -1;
}
else
{
for (i = 0; i < firstlen; i++)
{
if (inum_firstCP[i] > inum_second[i]) c++;
else if (inum_second[i] > inum_firstCP[i]) d++;
}
if (c>d) return 1;
else if (d>c) return -1;
}
return 0; // else
}
Run Code Online (Sandbox Code Playgroud)
如果您将这些大数相减,最简单的解决方案是取两个数,然后将另一个相减,直到剩下的东西小于零。这是基本的解决方案,它可以工作,但速度慢。
要使其更快,您可以执行以下操作:采用除数,将其乘以2,如果除数小于股息,则继续乘以。当您到达的第一个数字更大时,则将相应的位设置为1,然后减去相乘后的结果,然后对结果进行相同的操作。Wiki上很好地描述了同一件事。
为了使其工作,您需要实现自己的比较功能。假设您将malloc分配的大小存储在文件结构len中,则可以执行以下操作:
int compare( mynum &a, mynum &b){
if (a.len() > b.len()){
return 1;
} else (if b.len() > a.len()){
return -1;
} else(){
for(int i = b.len(); i > 0; i--){
if (a[i] > b[i]){
return 1;
} else if(b[i] > a[i]){
return -1;
}
}
#if we get there the numbers are the same
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)