给定一个很大的正数N。任务将N分为两个数字“ A”和“ B” ,以使它们之间的差为K (1 <= K <= 10 100 ),即A – B =K。
例子:
Input : N = 10, K = 2
Output : A = 6 B = 4
Input : N = 20, K = 4
Output : A = 12 B = 8
设两个必需的数字为“ A”和“ B”。因此,我们知道“ A”和“ B”的总和将以N结尾。
因此,一个等式变成了
A + B = N
而且,我们希望“ A”和“ B”之间的差等于“ K”。
因此,另一个等式变为
A – B = K
将两个方程相加,我们得到
2 * A = N + K
因此,A =(N + K)/ 2
然后我们可以找到B by, B =(N – A)
现在,要处理Big Integer,我们将Integer存储在字符数组中,并定义一个函数来对它们执行操作。
以下是此方法的C实现:
// C program to Divide a Big
// Number into two parts
#include
#include
#define MAX 100
// Function to adds two Numbers
// represnted as array of character.
void add(char v1[], char v2[])
{
int i, d, c = 0;
// length of string
int l1 = strlen(v1);
int l2 = strlen(v2);
// initializing extra character
// position to 0
for (i = l1; i < l2; i++)
v1[i] = '0';
for (i = l2; i < l1; i++)
v2[i] = '0';
// Adding each element of character
// and storing the carry.
for (i = 0; i < l1 || i < l2; i++) {
d = (v1[i] - '0') + (v2[i] - '0') + c;
c = d / 10;
d %= 10;
v1[i] = '0' + d;
}
// If remainder remains.
while (c) {
v1[i] = '0' + (c % 10);
c /= 10;
i++;
}
v1[i] = '\0';
v2[l2] = '\0';
}
// Function to subtracts two numbers
// represnted by string.
void subs(char v1[], char v2[])
{
int i, d, c = 0;
// Finding the length of the string.
int l1 = strlen(v1);
int l2 = strlen(v2);
// initializing extra character position to 0.
for (i = l2; i < l1; i++)
v2[i] = '0';
// Substrating each element of character.
for (i = 0; i < l1; i++) {
d = (v1[i] - '0' - c) - (v2[i] - '0');
if (d < 0) {
d += 10;
c = 1;
}
else
c = 0;
v1[i] = '0' + d;
}
v2[l2] = '\0';
i = l1 - 1;
while (i > 0 && v1[i] == '0')
i--;
v1[i + 1] = '\0';
}
// Function divides a number represented by
// character array a constant.
int divi(char v[], int q)
{
int i, l = strlen(v);
int c = 0, d;
// Dividing each character element by constant.
for (i = l - 1; i >= 0; i--) {
d = c * 10 + (v[i] - '0');
c = d % q;
d /= q;
v[i] = '0' + d;
}
i = l - 1;
while (i > 0 && v[i] == '0')
i--;
v[i + 1] = '\0';
return c;
}
// Function to reverses the character array.
void rev(char v[])
{
int l = strlen(v);
int i;
char cc;
// Reversing the array.
for (i = 0; i < l - 1 - i; i++) {
cc = v[i];
v[i] = v[l - 1 - i];
v[l - i - 1] = cc;
}
}
// Wrapper Function
void divideWithDiffK(char a[], char k[])
{
// Reversing the character array.
rev(a);
rev(k);
// Adding the each element of both array
// and storing the sum in array a[].
add(a, k);
// Dividing the array a[] by 2.
divi(a, 2);
// Reversing the character array to get output.
rev(a);
printf("%s ", a);
// Substracting each element of array
// i.e calculating a = a - b
rev(a);
subs(a, k);
// Reversing the character array to get output.
rev(a);
printf("%s", a);
}
// Driven Program
int main()
{
char a[MAX] = "100", k[MAX] = "20";
divideWithDiffK(a, k);
return 0;
}
输出:
60 40