Форум программистов, компьютерный форум CyberForum.ru

Сложение столбиком. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.74
mrReptiloid
 Аватар для mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,134
30.04.2011, 17:24     Сложение столбиком. #1
Привет всем!Я недавно начал изучать с++ и решил написать свою функцию сложения больших чисел т.е. длинную арифметику.Смысл не сложный.Мы считываем 2 числа в 2 строки в обратном порядке,получаем целочисленный тип каждого из них,складываем и записываем в 3 массив.Если результат выходит больше 9,то записываем в 3 строковую переменную <результат сложения>-10.И при следующем проходе цикла прибавляем единичку,которую записываем во флаговою переменную,а потом ее обнуляем.<-вот в этом и проблема,не хочет прибавлять эту флаговою переменную при следующем проходе цикла,ничего вообще ни прибавляет,а если изначально прибавлять к сложению единичку,то прибавляет к обеим слагаемым.Может что-то не так в цикле обратного отсета т.е. чтобы считывать с конца числа,как мы делаем это когда складываем в столбик..помогите.вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <conio.h>
#include <stdio.h>
#include <iostream>
 
int main()
{
//Обьявляем три строковые переменные.
    char* str=(char*)malloc(5000);
    char* st=(char*)malloc(5000);
    char* s=(char*)malloc(5000);
    int sum;//Переменная для вычисления суммы.
    int x =0;//Переменная для цикла.
    int i;//Переменная для цикла.
    int str1;//Переменная целого типа для каждого элемента первого слагаемого.
    int flag=0;//Флаговая переменная,для перенесения единицы в старший десяток.
    int str2;//Переменная целого типа для каждого элемента второго слагаемого.
    scanf("%s", str);//Считываем первое число в 1 строку.
    scanf("%s", st);//Считываем второе число во 2 строку.
    //Определяем длину обеих строк и записываем это число в переменные.
    int sm = strlen(str);
    int sm2 = strlen(st);
    for (x = sm,flag; x > 0; x--) 
{
 
    str1=str[x]-'0';//Получаем целочисленный тип каждого элемента первой строки.
    str2=st[x]-'0';//Получаем целочисленный тип каждого элемента второй строки.
    sum=str1+str2+flag;//Складываем каждый элемент с конца.
    s[x] = sum + '0';//Записываем в каждый элемент третьего массива результат сложения sum.
    s[sm] = 0;
    flag=0;
    if(sum>9)//Если результат сложения каких либо двух элементов 2 слагаемых больше 9....
{
    flag=1;
 
    s[x] = sum-10 + '0';
    s[sm] = 0;
}
    }
        
printf ("Summa = %s", s);//Выводим результат.
_getch();
}
ps пишу в visual c++ 2008,хоть это не столь принципиально,но разница от билдера есть..
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Антон555
13 / 13 / 0
Регистрация: 22.03.2011
Сообщений: 84
30.04.2011, 17:37     Сложение столбиком. #2
Цитата Сообщение от sniper_lunev Посмотреть сообщение
for (x = sm,flag; x > 0; x--)
это как понимать?

Добавлено через 1 минуту
объявление переменной "int x =0;//Переменная для цикла." можно убрать...
C++
1
for (int x = sm; x > 0; x--)
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 17:38     Сложение столбиком. #3
Мой вариант, давно делал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <string.h>
using namespace std;
void nol(char a[103],char b[103]){
    int i,c=strlen(a),d=strlen(b);
    if (c>d){
        for (i = d-1; i >=0; i--)
                b[i+c-d]=b[i];
        for (i = 0; i < c-d; i++)
                b[i]='0';
    }
    else
    {
        for (i = c-1; i >=0; i--)
            a[i-c+d]=a[i];
        for (i = 0; i < d-c; i++)
            a[i]='0';
    }
    return;
}
main(){
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    char a[103]="\0",b[103]="\0";
    cin >> a >> b;
    nol(a,b);
    int i,m=strlen(a),e=0;
    for (i = m-1; i >= 0; i--) {
    a[i]+=b[i]-48;
    if (a[i]>=58){
    a[i]-=10;
    if (i)a[i-1]++; else e++;
    }
    }
    if (e) cout << e;
    for (i = 0; i < m; i++)
    cout << a[i];
    return 0;
}
Антон555
13 / 13 / 0
Регистрация: 22.03.2011
Сообщений: 84
30.04.2011, 17:39     Сложение столбиком. #4
Пребавляйте вашу флаговую переменную внутри цикла сразу после фигурной скобки а условие цикла запишите как я написал выше и всё заработает.
mrReptiloid
 Аватар для mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,134
30.04.2011, 17:45  [ТС]     Сложение столбиком. #5
Цитата Сообщение от Антон555 Посмотреть сообщение
это как понимать?

Добавлено через 1 минуту
объявление переменной "int x =0;//Переменная для цикла." можно убрать...
C++
1
for (int x = sm; x > 0; x--)
Это цикл для обратного отсчета т.е. чтобы считывать в обратном порядке и складывать...может я ошибаюсь конечно немного,вообще сначала делал так
for (x = 0; x < sm; x++){} но это не с конца считывает,а по-порядку..проблема в том чтобы прибавить единичку к старшему разряду,можно конечно предыдущий элемент массива перевести в целое,а потом опять записать в массив но уже на 1 больше,но это не то....мне надо чтобы при следующем проходе цикла число увеличивалось на 1.
diagon
а это у вас вообще си,а у мне надо на с++ и мне нужно мой код доделать...но всеравно спасибо за помощь..=)

Пребавляйте вашу флаговую переменную внутри цикла сразу после фигурной скобки а условие цикла запишите как я написал выше и всё заработает.
я пробывал изначально сделать +1
sum=str1+str2+1 и выходило например если складывать 19+11 выходило 31,а не 30...т.е. прибавляло 1 к каждому слагаемому..
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 17:48     Сложение столбиком. #6
Это не си, просто о существовании динамических массивов я тогда не знал=)
На си скорее у вас...
mrReptiloid
 Аватар для mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,134
30.04.2011, 17:50  [ТС]     Сложение столбиком. #7
Цитата Сообщение от diagon Посмотреть сообщение
Это не си, просто о существовании динамических массивов я тогда не знал=)
На си скорее у вас...
да нет,у меня на с++ просто не люблю эти cinы и coutы=)
так все же с моей проблемой че там сделать можно,долго уже пытаюсь невыходит..
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 17:54     Сложение столбиком. #8
Также у вас не будет работать при неравном размере строк, т.к. длину второй строки вы вообще нигде не используете.
Предлагаю взять функцию nol из моего кода, приводит строки к равному размеру, к наименьшей добавляя лидирующие нули.
mrReptiloid
 Аватар для mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,134
30.04.2011, 17:57  [ТС]     Сложение столбиком. #9
Цитата Сообщение от diagon Посмотреть сообщение
Также у вас не будет работать при неравном размере строк, т.к. длину второй строки вы вообще нигде не используете.
Предлагаю взять функцию nol из моего кода, приводит строки к равному размеру, к наименьшей добавляя лидирующие нули.
забыл сказать,да я пока что делаю для чисел с одинаковой длиной,а потом уже буду добивать=)проблема-то сейчас не в этом...
пы сы можно просто нули приписвать к числу которое короче,так мы сравним их длину=))))
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 18:03     Сложение столбиком. #10
C++
1
 s[sm] = 0;
sm же просто длина строки, зачем вы в цикле дважды за итерацию меняете символ конца строки на 0?
mrReptiloid
 Аватар для mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,134
30.04.2011, 18:10  [ТС]     Сложение столбиком. #11
Цитата Сообщение от diagon Посмотреть сообщение
C++
1
 s[sm] = 0;
sm же просто длина строки, зачем вы в цикле дважды за итерацию меняете символ конца строки на 0?
а без этого преобразование каждого элемента строк в целые число не работает..это гдето на другом форсуме прочитал что так можно преобразовать,потому что atoi не хотел
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 18:17     Сложение столбиком. #12
Ну во-первых вы забыли, что в с++ нумерация массива идет с нулевого элемента.
Поэтому цикл будет выглядеть так
C++
1
for (x = sm-1,flag; x >= 0; x--)
Во-вторых, не нужно прибавлять '0' здесь
C++
1
s[x] = sum-10 + '0';
Итого почти работает.
P.S. и уберите s[sm]=0
P.P.S. Теперь не работает при неравном размере строк и если длина суммы больше длины слагаемых.
P.P.P.S. не забывайте освобождать память, выделенную под массивы. Делается это с помощью free();
mrReptiloid
 Аватар для mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,134
30.04.2011, 18:29  [ТС]     Сложение столбиком. #13
Ну во-первых вы забыли, что в с++ нумерация массива идет с нулевого элемента.
да вроди помню..=)))
у меня итак почти все работало,кроме того когда результат сложения чисел выходит больше 9...
пысы сейчас исправлю..

Добавлено через 9 минут
нееее,тут все таки надо все это..


C++
1
s[x] = sum-10 + '0';
это такое способ преобразования из char в int аналогичный atoi...если убрать + '0',то это в результате будет выходит какя-то хрень,символы =№": или еще чето вместо цифр..
а если убрать s[sm]=0 то складывает праильно но после результата сложения выводит===============================================и так тысячу этих знаков..говорю же это способы преобразования типов,читал гдето на форуме по ANSII...
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 18:32     Сложение столбиком. #14
Вы уже прибавили к ней '0' до этого, не нужно этого делать во второй раз.
C++
1
2
3
s[x] = sum + '0'; 
...
s[x] = sum-10 + '0';
Дело в том, что char это тоже целочисленный тип, прибавляя или отнимая '0' вы соответственно прибавляете или отнимаете от него 48.
Допустим было int число 5, вы прибавили к нему 48, получили 53, что равно '5'. Если прибавить во второй раз 5+48+48=101, что равно 'e'
mrReptiloid
 Аватар для mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,134
30.04.2011, 18:36  [ТС]     Сложение столбиком. #15
Цитата Сообщение от diagon Посмотреть сообщение
Вы уже прибавили к ней '0' до этого, не нужно этого делать во второй раз.
C++
1
2
3
s[x] = sum + '0'; 
...
s[x] = sum-10 + '0';
но второй раз это же в блоке условия,протестил если убрать то просто небудет никакого символа т.е. если сложить 9 и 1 то будет " " пустота вместо цифры...
я преобразовую типы "таким" способом,потому что стндртн. функция библиотек-atoi не хочет преобразовывть каждый элемент отдельно,а только всю строку целиком,но это уже тупик для моей задачи будет..
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 18:43     Сложение столбиком. #16
В общем я немного запутался, вот ваш цикл, лично у меня выполняет свои функции... У меня билдер правда, но особой роли это играть не должно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    for (x = sm-1,flag; x >= 0; x--)
{
 
    str1=str[x]-'0';//Получаем целочисленный тип каждого элемента первой строки.
    str2=st[x]-'0';//Получаем целочисленный тип каждого элемента второй строки.
    sum=str1+str2+flag;//Складываем каждый элемент с конца.
    s[x] = sum + '0';//Записываем в каждый элемент третьего массива результат сложения sum.
    flag=0;
    if(sum>9)//Если результат сложения каких либо двух элементов 2 слагаемых больше 9....
{
    flag=1;
 
    s[x] = sum-10;
    }
    }
mrReptiloid
 Аватар для mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,134
30.04.2011, 18:46  [ТС]     Сложение столбиком. #17
Цитата Сообщение от diagon Посмотреть сообщение
В общем я немного запутался, вот ваш цикл, лично у меня выполняет свои функции... У меня билдер правда, но особой роли это играть не должно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    for (x = sm-1,flag; x >= 0; x--)
{
 
    str1=str[x]-'0';//Получаем целочисленный тип каждого элемента первой строки.
    str2=st[x]-'0';//Получаем целочисленный тип каждого элемента второй строки.
    sum=str1+str2+flag;//Складываем каждый элемент с конца.
    s[x] = sum + '0';//Записываем в каждый элемент третьего массива результат сложения sum.
    flag=0;
    if(sum>9)//Если результат сложения каких либо двух элементов 2 слагаемых больше 9....
{
    flag=1;
 
    s[x] = sum-10;
    }
    }
я так и делал,но у меня в vs 2008 работает но неправильно,уже писал об ошибке...
а вы какие числа у себя складывали??а если 9 и 1 то что выходит?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 18:48     Сложение столбиком. #18
9 и 1 работать не будут, так как это не предусмотрено в вашей программе.
8 и 1 будут.
mrReptiloid
 Аватар для mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,134
30.04.2011, 18:53  [ТС]     Сложение столбиком. #19
а это что?
if(sum>9)//Если результат сложения каких либо двух элементов 2 слагаемых больше 9....
{
flag=1;

s[x] = sum-10;
}
}
в моем первом коде если складывать 9 и 1 напишет 0...а у вас что будет если сложить??
работать не будут, так как это не предусмотрено в вашей программе.
именно в этом и проблема мне надо чтобы работало,т.е. чтобы к старшему разряду прибавляло единичку..а как это сделать непойму....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2011, 19:12     Сложение столбиком.
Еще ссылки по теме:

сложить столбиком два числа char C++
C++ Перемножение столбиком двух массивов char
Деление длинных чисел столбиком C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 19:12     Сложение столбиком. #20
У вас не предусмотрено, что размер суммы может быть больше размера слагаемых.
Посмотрите мой код, там это предусмотрено.
Там в 32 строке стоит условие, что если элемент массива ненулевой, то инкрементируется s[i-1], иначе специальная переменная, и если она не равна нулю то перед суммой выводится еденичка.

Добавлено через 7 минут
Еще одна ошибочка у вас
C++
1
s[x] = sum-10
Исправьте на
C++
1
s[x] -= 10
А после цикла дополните вывод
C++
1
2
3
printf("Summa = ");
    if (flag) printf("1");
    printf ("%s",s);//Выводим результат.
Теперь все работает, если размер строк равен.
Чтобы считало, даже если размер строк неравен, копируем функцию nol из моего кода, и после считывания переменных вставляем nol(st,str);
Yandex
Объявления
30.04.2011, 19:12     Сложение столбиком.
Ответ Создать тему
Опции темы

Текущее время: 12:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru