📜  将大数分成两个相差k的部分

📅  最后修改于: 2021-04-28 16:35:57             🧑  作者: Mango

给定一个很大的正数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