Добавьте два больших числа в виде строк - PullRequest
0 голосов
/ 27 октября 2018

Я не добавляю «настоящий» код сюда фрагменты кода, потому что я пробовал так много вариантов - с переменным успехом - что я просто собираюсь использовать C-подобный псевдокод.

===

Я хочу добавить два числа, которые превышают самое большое ANSI C long long (например, два 50-значных числа)

Идея состоит в том, что я бы использовал два char[] массива и сделал бы классическое сложение стиля пера и бумаги, преобразовав каждый символ двух добавлений в целые, добавив и перенеся десятки, а затем назначив результаты как char снова в массив char[].

Проблема, с которой я сталкиваюсь, заключается в преобразовании char в int (что всегда не получается) ... и последующем добавлении результата в другой текстовый массив. Попытка добавить символ к char result[] с использованием result[i] = "5" или даже его значения ascii result[i] = 53 всегда заканчивается неудачей.

псевдокод

int add(char *n1, char *n2){
    // examples (Intentionally not the same length)
    // n1     = "12345678901234567890"
    // n2     =      "987654321098765"
    char result[100]; // array for resulting added ints as char
    int r = 100; // The index (set to end) for the result array 
    result[r] = 0; // Assign the char-halt to END of the result
    int carry = 0; //  for carrying the 10s
    maxlength = <length of largest addend> // (sizeof(n)/sizeof(n[0])) doesnt work because pointers

    // start at end (right end) of arrays and move towards start (left end)
    // each loop takes one character, starting at the far RIGHT (end) of the string array
    // i = (maxlength - 1) to skip stop "0"
    for (int i = (maxlength - 1); i >= 0; i--) { 
        a1 = int()n1[i] // doesnt return correct value in tests. Neither does a1 = n1[i]-0
        a2 = int()n1[i] // doesnt return correct value in tests. Neither does a1 = n1[i]-0
        int asum = a1 + a2 + carry

        // carry all the tens
        carry = 0; // reset carry
        while (asum > 10){
            carry += 10; 
            asum -= 10; 
        }
        result[r] = char()asum 
        r -= 1 // Move result index one to the LEFT
    }
}    

1 Ответ

0 голосов
/ 27 октября 2018

Проблемы, с которыми я сталкиваюсь, заключается в преобразовании char в int ...

Стандарт C гарантирует, что 10 символов от '0' до '9' будут содержать последовательно и увеличивающиеся значения:

5.2.1 Наборы символов

[...]

3 И базовый, и базовый наборы символов исполнения должны иметь следующие члены: 10 десятичных цифр

0 1 2 3 4 5 6 7 8 9

[...] значение каждого символа после 0 в приведенном выше списке десятичных цифр должно быть на единицу больше, чем значение предыдущего.

Посмотрите на это и получите понятие:

#include stdio.h>

int main(void)
{
  char c = '7'; 
  int i = c - '0'; 

  printf("c = %c, i = %d\n", c, i); 
}
...