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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.74
mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,321
#1

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

30.04.2011, 17:24. Просмотров 4267. Ответов 37
Метки нет (Все метки)

Привет всем!Я недавно начал изучать с++ и решил написать свою функцию сложения больших чисел т.е. длинную арифметику.Смысл не сложный.Мы считываем 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,хоть это не столь принципиально,но разница от билдера есть..
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2011, 17:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сложение столбиком. (C++):

Сложение столбиком - C++
Необходимо реализовать сложение столбиком.Длинная арифметика так сказать. Вроде понимаю как.но вот проблема.а как сделать так чтобы...

Вычеслить столбиком - C++
Вычеслить Сталбиком следующие числа 2,2, 2,4, 2,6, ..., 4,2.

Калькулятор. Деление столбиком - C++
Помогите решить проблему с делением длинных чисел в столбик. Конкретно , не понимаю как программно написать &quot;отщипывание&quot; у делителя...

Вычитание, умножение, деление столбиком - C++
дано мне в классе 2 числа представленные в виде массивов. вот..для них у меня должны быть перегрузки операций сложения,вычитания,умножения...

Деление длинных чисел столбиком - C++
Привет. У меня возникла проблема при написании курсовой. Необходимо реализовать деление двух больших чисел(записанных &quot;зеркально&quot;). Хотя я...

Вывод символов строки столбиком - C++
подскажите пожалуйста написал вот такой код #include &lt;iostream&gt; using namespace std; int main(int argc, char* argv) { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
diagon
Higher
1929 / 1195 / 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;
    }
    }
0
mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,321
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 то что выходит?
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 18:48 #18
9 и 1 работать не будут, так как это не предусмотрено в вашей программе.
8 и 1 будут.
0
mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,321
30.04.2011, 18:53  [ТС] #19
а это что?
if(sum>9)//Если результат сложения каких либо двух элементов 2 слагаемых больше 9....
{
flag=1;

s[x] = sum-10;
}
}
в моем первом коде если складывать 9 и 1 напишет 0...а у вас что будет если сложить??
работать не будут, так как это не предусмотрено в вашей программе.
именно в этом и проблема мне надо чтобы работало,т.е. чтобы к старшему разряду прибавляло единичку..а как это сделать непойму....
0
diagon
Higher
1929 / 1195 / 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);
1
mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,321
30.04.2011, 19:12  [ТС] #21
Ну а вообще как должно выглядить прибавление 1 к старшему разряду,как это в моем коде написать???
т.е. у нас если сумма будет выходить больше 9,то во флаговою переменн. мы запишем 1,и при следующкм проходе цикла надо добавть эту флаговою переменную к сумме,а потом обнулить???как это решается?
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 19:14 #22
Я дополнил свое предыдущее сообщение, там все написано=)
1
mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,321
30.04.2011, 19:16  [ТС] #23
я уже посмотрел а поподробнее можно что значит вот это
if (flag) printf("1");
printf ("%s",s);//Выводим результат.
и если складывать 19 и 11 всеравно выйдет 20 вместо 30(....
но спасибо=))))))
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 19:20 #24
У меня выводит 30
о_О
Вы же в своем цикле увеличивали свой флаг, но делали это исключительно для инкремента следующего разряда. В последней итерации идет проверка нулевого элемента, и если он больше 9, то флаг увеличивался, но т.к. следующей итерации не было, то он не обнулялся. Таким образом, если флаг не равен нулю(что и означает (flag) ), то к числу необходимо приписать спереди 1.
P.S. сам не понял что написал, ну да ладно
1
mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,321
30.04.2011, 19:23  [ТС] #25
Цитата Сообщение от diagon Посмотреть сообщение
У меня выводит 30
о_О
Вы же в своем цикле увеличивали свой флаг, но делали это исключительно для инкремента следующего разряда. В последней итерации идет проверка нулевого элемента, и если он больше 9, то флаг увеличивался, но т.к. следующей итерации не было, то он не обнулялся. Таким образом, если флаг не равен нулю(что и означает (flag) ), то к числу необходимо приписать спереди 1.
P.S. сам не понял что написал, ну да ладно
тьфу!!!это я тупонул...забыл в условии написать flag=1;воот теперь все работает спасибо!!=)

Вы же в своем цикле увеличивали свой флаг, но делали это исключительно для инкремента следующего разряда. В последней итерации идет проверка нулевого элемента, и если он больше 9, то флаг увеличивался, но т.к. следующей итерации не было, то он не обнулялся. Таким образом, если флаг не равен нулю(что и означает (flag) ), то к числу необходимо приписать спереди 1.
блин,нифига не понял,а мне надо понять,так как если не пойму это задание не выполню следующее....да и вообще надо бы понять..
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 19:25 #26
Лучше flag==1, все-таки, а то условие всегда выполняется будет=)
0
mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,321
30.04.2011, 19:26  [ТС] #27
эт,а литературы какой по этому нету????а то мне вот это вот надо бы понять...
Вы же в своем цикле увеличивали свой флаг, но делали это исключительно для инкремента следующего разряда. В последней итерации идет проверка нулевого элемента, и если он больше 9, то флаг увеличивался, но т.к. следующей итерации не было, то он не обнулялся. Таким образом, если флаг не равен нулю(что и означает (flag) ), то к числу необходимо приписать спереди 1.
Лучше flag==1, все-таки, а то условие всегда выполняется будет=)
гы а вот так уже не хочет...опять 20 вместо 30)))


я ведь только начал учится..
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 19:30 #28
В общем если нулевой элемент был больше 9, то флаг увеличивался, а так как цикл больше не выполнялся, то флаг оставался равным одному и после цикла.
Например, 9+1, в массиве лежит 0. Но ведь должно получится 10, поэтому и прибавляем спереди еденичку. И это работает при любых числах.
В VC должен быть дебаггер, посмотрите что там не так выполняется...
Вообще вот область кода, которую я изменял, посмотрите, может, ошиблись где...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (x = sm-1; 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] = s[x]-10;
    }
    }
    printf("Summa = ");
    if (flag) printf("1");
    printf ("%s",s);//Выводим результат.
1
mrReptiloid
309 / 172 / 8
Регистрация: 30.04.2011
Сообщений: 1,321
30.04.2011, 19:37  [ТС] #29
Блин,сейчас в новом проэкте проверил свой первый код он тоже нормально прибавляет...че за прикол??а раньше в старом проэкте не хотело работать правильно.
т.е. раньше в том коде при сложении 19 и 11 выходило 20 а сейчас в том же коде уже 30 выходит...о_О)значит я писал правильно...
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.04.2011, 19:38 #30
Из литературы могу посоветовать этот сайт
http://********/article.asp?id_text=1329
Там же можно проверить, верно ли вы решили.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2011, 19:38
Привет! Вот еще темы с ответами:

Сложить столбиком два числа char - C++
как сложить столбиком 2 числа записанных в char? Объясните кодом

Перемножение столбиком двух массивов char - C++
Здравствуйте. Задание таково: используя символьный массив char, который отображает два положительных целых числа - создать третий...

Вывести все символы заданного предложения столбиком - C++
Дано предложение. Вывести &quot;столбиком&quot; его первый, второй, пятый, шестой, девятый, десятый и т. д. символы.

Напечатать столбиком значения sin2,sin3,...,sin20 - C++
Напечатать столбиком значения sin2,sin3,...,sin20


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.04.2011, 19:38
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru