Сложите два больших числа в виде строк

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

===

Я хочу добавить два числа, которые превышают самый большой ANSI Clong 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' == 1. Наиболее распространенная кодировка символов - ASCII, и если вы посмотрите на цифры, я уверен, что вы сможете найти какой-то шаблон и простой способ преобразовать закодированную цифру в ее целочисленный эквивалент (подсказка: это включает вычитание между символы).

Some programmer dude 27.10.2018 12:21

Кроме того, при создании Минимальный, полный и проверяемый пример, даже если это псевдокод, убедитесь, что он не содержит таких очевидных ошибок, которые являются вашими неудачными приведениями.

Some programmer dude 27.10.2018 12:24

Попробуйте char c = '7'; int i = c - '0'; printf("c = %c, i = %d\n", c, i);

alk 27.10.2018 12:32

@alk HA! Это фактически решило ОБЕ проблемы преобразования его в int и добавления его в массив результатов. Проблема заключалась в том, что я не заключал в уравнение одинарные кавычки. Если вы хотите перефразировать это как ответ, я выберу его и проголосую за. Спасибо!

RightmireM 27.10.2018 12:50

@Someprogrammerdude Я ценю направление. Те приведения, которые действительно потерпели неудачу, были получены из ответов на решение аналогичных проблем, связанных с ответом на StackOverflow. Я новичок в c, поэтому не осознавал, что это очевидные ошибки. Это недопустимые приведения в ansi c?

RightmireM 27.10.2018 12:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
740
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

The problems I'm running into is converting the char to int ...

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

5.2.1 Character sets

[...]

3 Both the basic source and basic execution character sets shall have the following members: the 10 decimal digits

0 1 2 3 4 5 6 7 8 9

[...] the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.

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

#include stdio.h>

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

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

Я не думаю, что C в ASCII - это то, что гарантирует, что "в C" (дайте мне один язык программирования, который имеет что-то отличное от ASCII для основных символов, вздох), от '0' до '9' будут последовательные значения char в диапазоне [48; 57] но в остальном это хороший ответ. ASCII также не имеет ничего общего со стандартом C. printf() и аналогичные могут быть в стандарте C, но то, что выводится на экран, на самом деле не соответствует стандарту C, чтобы в двух словах определить как printf(), - это просто системный вызов ОС с произвольными байтами, которые будут напечатаны, как угодно ОС.

Purple Ice 27.10.2018 16:11

@PurpleIce, мой ответ никоим образом не говорит об ASCII.

alk 27.10.2018 16:21

@PurpleIce ... более того, C не знает ASCII. Только его реализация знает ... и их несколько, если не сказать много.

alk 27.10.2018 16:23

@Purpleice: например, прочтите 3-е предложение здесь. И есть компиляторы C для "коробок", продаваемых этой компанией ... ;-)

alk 27.10.2018 16:37

Я хочу сказать, что символы от «0» до «9» не являются частью стандарта C, это стандарт ASCII, который используется во всем мире. Если вы хотите поспорить об этом, то можно также сказать, что каждая ОС, которая может запускать машинный код, генерируемый компиляторами C, является частью стандарта C. Поскольку вы знаете, что на самом деле C полагается на конкретную среду, и он может работать в среде, где кодировки совершенно разные для каждой буквы, и он все равно будет работать правильно, он не имеет ничего общего с самим C, для самой программы это просто произвольно числа и ОС обрабатывает их, когда вы распечатываете их на экране :)

Purple Ice 27.10.2018 17:54

Поэтому говорить о гарантиях "C Standard" совершенно неправильно. Кто угодно мог написать за вечер ОС, где это было бы не так, но программы, выпущенные gcc, все равно работали бы должным образом, и тогда это нарушило бы стандарт, потому что стандарт не гарантирует этого. ОС, которые используют глобально одинаковые символы, потому что нам нравится, когда все одинаково везде.

Purple Ice 27.10.2018 17:58

@PurpleIce мой ответ цитирует стандарт C, даже ссылки на его копию. Поэтому, пожалуйста, сделайте второй взгляд, а затем скажите мне, какая часть ответа, по вашему мнению, неверна.

alk 27.10.2018 21:30

@PurpleIce Конечно, мой ответ написан с точки зрения программиста на C. Вопрос помечен как C.

alk 27.10.2018 21:38

Это "" "гарантировано" "" только в том случае, если вы скомпилируете свою программу для большинства популярных платформ, то есть для систем на основе Unix, Windows, macOS, их модификаций, таких как Android и т. д. Как я уже сказал, если возникнет новая система, она будет в значительной степени обесценивают это. Эта часть написана с предположением, что такого никогда не произойдет, это само по себе не гарантирует этого. Вместо того чтобы делать вид, будто это действительно гарантия, вы должны знать, на каких платформах это будет правдой. Помните, что этот ответ может быть прочитан 10 лет спустя, когда, например, Windows может даже устареть.

Purple Ice 28.10.2018 09:02

... где основной набор символов будет иметь такие числа, как 0, 2, 4, 6, 8, 1, 3, 5, 7, 9. Потому что, кто знает? Это все же лучше, чем иметь дело с winAPI. Но вы знаете, я не думаю, что C устареет 10 лет спустя. И что произойдет с этой «гарантией», которая никогда не была гарантирована, а просто предполагалась? Наборы символов - это отдельная вещь, и они ВООБЩЕ не зависят от языка. Они даже не взаимодействуют напрямую с программой C, ОС принимает ваши символы и преобразует их в глифы, когда отображает их на экране, как стандарт C может вообще повлиять на это?

Purple Ice 28.10.2018 09:06

Другие вопросы по теме