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

Сложение чисел ! недопуск на екзамен ! - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.64
medVet
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 9
24.01.2010, 12:04     Сложение чисел ! недопуск на екзамен ! #1
Нужно написать функцию, которая позволяет сложить ( + ) два целых положительных числа, без ограничения на величину чисел.

Завтра нужно сдать, а то недопуск на экзамен, я набрасал прогу, вроде выводит результат, но что-то мне ,кажеться, я там нахомутал....
В общем нужно ваша помощь, гляньте что не так? (
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
43
44
45
46
47
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
char perevorot(char *x);
void main()
{  clrscr();
char a[100], b[100], Temp[100], f[100], *as, *bn; int x,c,v,len1,len2,k,i,one=0,pos=0;
cin>>a>>b;
 len1=strlen(a); len2=strlen(b); if (len1>len2) k=len1; else k=len2;
perevorot(a);
perevorot(b);
for(i=0;i<=k;i++)
{
*bn=b[i]; *as=a[i];
x=atoi(as); c=atoi(bn);
v=x+c+one;
if(i==k && v==0) k=k-1;
if(v>9) {one=1;v=v-10; f[i]=v; } else {f[i]=v; one=0; }
}
//perevorot(f);
i=k; pos=0;
while (i>=0)
{
Temp[pos]=f[i];
pos++;i--;
}
for(i=0;i<=k;i++)
f[i]=Temp[i];
for(i=0;i<=k;i++)
 cout<<(f[i]+0);
getch(); return;
}
char perevorot(char* x)
 {
char Temp[100], *as; int k, i,pos=0;
k=strlen(x);
i=k-1;
while (i>=0)
{
Temp[pos]=x[i];
pos++; i--;
}
for(i=0;i<k;i++)
x[i]=Temp[i];
return *x;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2010, 12:04     Сложение чисел ! недопуск на екзамен !
Посмотрите здесь:

C++ Сложение двух чисел
Сложение больших чисел C++
сложение двух чисел в С C++
после завтра екзамен! C++
Сложение чисел C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.Loner
 Аватар для Mr.Loner
42 / 42 / 4
Регистрация: 23.01.2010
Сообщений: 152
24.01.2010, 12:34     Сложение чисел ! недопуск на екзамен ! #2
По-моему, чушь полная.
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
#define DMAX 100
 
typedef int thuge[DMAX];
 
void add(thuge &a, thuge &b){
//функция прибавляет к числу a число b
      if (a[0] < b[0]) a[0] = b[0];
//складывать нужно до размера большего числа
      int r = 0;
/*r - обозначает сколько у нас "в уме"
при сложение младших цифр в уме у нас 0*/
      for(int i = 1; i <= a[0]; ++i) {
            a[i] += b[i] + r;
            //сумма очередных цифр и переноса
            if (a[i] >= 10) {
            //случай, когда происходит перенос в следующий разряд
                  r = 1;
                  a[i] -= 10;
            } else {
            //случай, когда переноса не происходит
                  r = 0;
            }
      }
      //если после сложения остался еще перенос, то нужно добавить еще одну цифру
      if (r > 0) {
            a[0]++;
            a[a[0]] = r;
      }
}
Добавлено через 4 минуты
Функцию скопипастил. Тут память не очень экономно используется, но алгоритм правильный. Легко исправить под свои нужды.
medVet
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 9
24.01.2010, 13:36  [ТС]     Сложение чисел ! недопуск на екзамен ! #3
Mr.Loner,
функцие передаеться массив, числа в массиве записуються начиная с 0 элемента:
7: if (a[0] < b[0]) a[0] = b[0]; бред
25-27 тотже бред.
Mr.Loner
 Аватар для Mr.Loner
42 / 42 / 4
Регистрация: 23.01.2010
Сообщений: 152
24.01.2010, 13:41     Сложение чисел ! недопуск на екзамен ! #4
ну почему же? в a[0] количество цифр в числе
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
24.01.2010, 13:41     Сложение чисел ! недопуск на екзамен ! #5
В чём смысл задания, это оригинальное задание?
medVet
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 9
24.01.2010, 13:50  [ТС]     Сложение чисел ! недопуск на екзамен ! #6
смысл в том что мы передаем функцие два массива типа char а и получаем третий массив char с результатом сложения.
Смысл моего алг был в том что я переворачивал числа и слаживал их "как делаеться ето в столбик на листочке" и потом переворачивал результат.
вот код только с пояснениями
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
43
44
45
46
47
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
char perevorot(char *x);
void main()
{  clrscr();
char a[100], b[100], Temp[100], f[100], *as, *bn; int x,c,v,len1,len2,k,i,one=0,pos=0; // a[]- pervoe chislo, b[]-vtoroe chislo , f[]-rezultat;
cin>>a>>b;
 len1=strlen(a); len2=strlen(b); if (len1>len2) k=len1; else k=len2;  
perevorot(a);
perevorot(b); 
for(i=0;i<=k;i++)  // alg slogeniyz 4isel;
{
*bn=b[i]; *as=a[i]; 
x=atoi(as); c=atoi(bn);
v=x+c+one;
if(i==k && v==0) k=k-1; // uberaem liwniy null ; 
if(v>9) {one=1;v=v-10; f[i]=v; } else {f[i]=v; one=0; }
}
//perevorot(f);  //moget kto podskaget kak organizovat perevorot rezultata cherez tu ge funciyu; 
i=k; pos=0;
while (i>=0)   //perevorot rezultata
{
Temp[pos]=f[i];
pos++;i--;
}
for(i=0;i<=k;i++)
f[i]=Temp[i];
for(i=0;i<=k;i++)   //vuvod na ekran
 cout<<(f[i]+0);    // 0 dobovlial chtobu proeshodilo preobrozovaviya tipov po umolchaniyu
getch(); return;
}
char perevorot(char* x)   //func perevorota chisla
 {
char Temp[100], *as; int k, i,pos=0;
k=strlen(x);
i=k-1;
while (i>=0)
{
Temp[pos]=x[i];
pos++; i--;
}
for(i=0;i<k;i++)
x[i]=Temp[i];
return *x;
}
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
24.01.2010, 13:55     Сложение чисел ! недопуск на екзамен ! #7
Смысл моего алг был в том что я переворачивал числа и слаживал их "как делаеться ето в столбик на листочке" и потом переворачивал результат.
Зачем их переворачивать?
medVet
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 9
24.01.2010, 14:01  [ТС]     Сложение чисел ! недопуск на екзамен ! #8
так проще вроде:
945
+
234
переварачиваем
549
+
432
9711
перевернули
1179
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
24.01.2010, 15:21     Сложение чисел ! недопуск на екзамен ! #9
Ты что компьютер в столбик заставляешь считать, круто.
medVet
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 9
24.01.2010, 15:36  [ТС]     Сложение чисел ! недопуск на екзамен ! #10
я незнаю что ещо делать... посоветйте другой вариант решения, времени в обрез..
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
24.01.2010, 16:45     Сложение чисел ! недопуск на екзамен ! #11
Так что есть два произвольных массива с значениями,
Создать третий: элементы третьего должны быть суммой элементов второго и первого?
medVet
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 9
24.01.2010, 16:54  [ТС]     Сложение чисел ! недопуск на екзамен ! #12
Genius Ignat, да, масивы должны быть типа char, одно число одна ячейка.
но если есть ещо какой-то вариант решения поставленой задачи предлагай
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
24.01.2010, 17:34     Сложение чисел ! недопуск на екзамен ! #13
без ограничения на величину чисел: Что это?
( + ) два целых положительных числа: а зачем тогда массивы?
medVet
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 9
24.01.2010, 17:42  [ТС]     Сложение чисел ! недопуск на екзамен ! #14
Genius Ignat, ето значит что числа могут непомещаться не в один определенный тип, т.е нужно записовать числа в массив и складывать
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
24.01.2010, 18:31     Сложение чисел ! недопуск на екзамен ! #15
Короче буду работать по этой схеме.
Так что есть два произвольных массива с значениями,
Создать третий: элементы третьего должны быть суммой элементов второго и первого
Добавлено через 23 минуты
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
#include <iostream.h>
long SUM_MAS(int *masOp1, int *masOp2, int *SumM, int Csize);
long Print(const int *buf,int size);
void main(){
const int size = 4;
int mas1[size]={1,2,3,4};
int mas2[size]={4,3,2,1};
int smas[size] = {0};
SUM_MAS(mas1,mas2,smas,size);
Print(smas,size);
 
 
 
}
 
long SUM_MAS(int *masOp1, int *masOp2, int *SumM, int Csize){
for(int i=0;i<Csize;i++)SumM[i]=masOp1[i]+masOp2[i];
return 0;
}
long Print(const int *buf,int size){
for(int i=0;i<size;i++)cout<<buf[i];
cout<<'\n';
return 0;
}
С типом char ни чего хорошего не выйдет.
medVet
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 9
24.01.2010, 18:33  [ТС]     Сложение чисел ! недопуск на екзамен ! #16
Genius Ignat, то что я напрограмил вроде работает, но после нескольких использований перестает верно считать, спасает перезапуск среды Борланд. непойму в чем трабл.
Мне по заданию нужно создать функцию, которой бы передавалось два масива чисел типа char а она возвращала суму елементов первого и второго.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.01.2010, 20:33     Сложение чисел ! недопуск на екзамен ! #17
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
43
44
45
46
47
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
char perevorot(char *x);
void main()
{  //clrscr();
char a[100], b[100], Temp[100], f[100], as, bn; int x,c,v,len1,len2,k,i,one=0,pos=0;
cin>>a>>b;
 len1=strlen(a); len2=strlen(b); if (len1>len2) k=len1; else k=len2;
perevorot(a);
perevorot(b);
for(i=0;i<=k;i++)
{
bn=b[i]; as=a[i];
x=atoi(&as); c=atoi(&bn);
v=x+c+one;
if(i==k && v==0) k=k-1;
if(v>9) {one=1;v=v-10; f[i]=v; } else {f[i]=v; one=0; }
}
//perevorot(f);
i=k; pos=0;
while (i>=0)
{
Temp[pos]=f[i];
pos++;i--;
}
for(i=0;i<=k;i++)
f[i]=Temp[i];
for(i=0;i<=k;i++)
 cout<<(f[i]+0);
getch(); return;
}
char perevorot(char* x)
 {
char Temp[100]; int k, i,pos=0;
k=strlen(x);
i=k-1;
while (i>=0)
{
Temp[pos]=x[i];
pos++; i--;
}
for(i=0;i<k;i++)
x[i]=Temp[i];
return *x;
}
Вот так попробуйте.
Цитата Сообщение от medVet Посмотреть сообщение
два целых положительных числа, без ограничения на величину чисел.
Ограничения все равно есть.
medVet
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 9
25.01.2010, 03:36  [ТС]     Сложение чисел ! недопуск на екзамен ! #18
valeriikozlov, неправильно считает.

Добавлено через 6 часов 30 минут
почти написал: но опять трабл. Функция slogenie возвращает масив g со значением сумы двух чисел, но при задействования к ней функции подсчета елементом strlen - она выдает количество символов до первого встречающегося нуля, например: число в масиве g =102324 strlen выдаст 1 ,вопрос как сделать что-бы выдало 6 (т.е действительное количество)?
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
 
char* slogenie(char *a, char *b, char *f);
 
void main()
{char s[100],d[100],g[100];
clrscr();
cin>>s>>d;
slogenie(s,d,g);  cout<<"\n";
int k;
k=strlen(g); cout<<" k= "<<k<<"  ";     вот сдесь 
for(int i=0;i<10;i++)
cout<<g[i]+0;
getch();
 
  }
 char* slogenie(char *a,char *b,char *f)
 
{
char perevorot(char *x);
char Temp[100], *as, *bn; int x,c,v,len1,len2,k,i,one=0,pos=0;
len1=strlen(a); len2=strlen(b); if (len1>len2) k=len1; else k=len2;
perevorot(a);
perevorot(b);
for(i=0;i<=k;i++)
{
x=(a[i]-48); c=(b[i]-48);  if(a[i]==0) x=0; if(b[i]==0) c=0;
v=x+c+one;
if(i==k && v==0) k=k-1;
if(v>9) {one=1;v=v-10; f[i]=v;} else {f[i]=v; one=0; }
}
i=k; pos=0;
while (i>=0)
{
Temp[pos]=f[i];
pos++;i--;
}
for(i=0;i<=k;i++)
f[i]=Temp[i];// f[k+1]='\0';
for(i=0;i<=k;i++)
cout<<(f[i]+0);
 
return f;
}
char perevorot(char* x)
 {
char Temp[100], *as; int k, i,pos=0;
k=strlen(x);
i=k-1;
while (i>=0)
{
Temp[pos]=x[i];
pos++; i--;
}
for(i=0;i<k;i++)
x[i]=Temp[i];
return *x;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.01.2010, 04:36     Сложение чисел ! недопуск на екзамен ! #19
medVet, держи:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <assert.h>
 
char* Sum(const char* first, const char* second)
{
  assert(first );
  assert(second);
 
  int first_len  = static_cast<int>(strlen(first ));
  int second_len = static_cast<int>(strlen(second));
  int sum_len    = (first_len > second_len ? first_len : second_len) + 1;
 
  char* sum = new char[sum_len + 1];
 
  sum[sum_len] = '\0';
 
  int first_index  = first_len  - 1;
  int second_index = second_len - 1;
  int sum_index    = sum_len    - 1;
 
  int rest = 0;
 
  while(first_index >= 0 && second_index >= 0){
    int tmp = (first[first_index] - static_cast<int>('0')) + 
      (second[second_index] - static_cast<int>('0')) + rest;
 
    sum[sum_index] = static_cast<char>(tmp % 10) + '0';
 
    rest = tmp / 10;
 
    --first_index;
    --second_index;
    --sum_index;
  }
 
  while(first_index >= 0){
    int tmp = first[first_index] - static_cast<int>('0') + rest;
 
    sum[sum_index] = static_cast<char>(tmp % 10) + '0';
 
    rest = tmp / 10;
 
    --first_index;
    --sum_index;
  }
 
  while(second_index >= 0){
    int tmp = second[second_index] - static_cast<int>('0') + rest;
 
    sum[sum_index] = static_cast<char>(tmp % 10) + '0';
 
    rest = tmp / 10;
 
    --second_index;
    --sum_index;
  }
 
  sum[sum_index] = static_cast<char>(rest) + '0';
 
  return sum;
}
int main()
{
  char first[]  = "234";
  char second[] = "81";
 
  char* sum = Sum(first, second);
 
  std::cout << sum << std::endl;
 
  delete [] sum;
 
  return 0;
}
Единственный недочет - при необходимости добавляет символ 0 в начало результата - как в примере.
В коде присутствуют излишние переменные (которые, поколдовав, можно убрать), оставленные для наглядности.
Результат: http://codepad.org/B9VBRd9x
Надеюсь не слишком поздно написал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2010, 06:11     Сложение чисел ! недопуск на екзамен !
Еще ссылки по теме:

Сложение больших чисел C++
сложение чисел C++
C++ Написать программу которая выводит сумму чисел от a до b. Сложение чисел выполнять в процедуре

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

Или воспользуйтесь поиском по форуму:
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.01.2010, 06:11     Сложение чисел ! недопуск на екзамен ! #20
Цитата Сообщение от medVet Посмотреть сообщение
Функция slogenie возвращает масив g со значением сумы двух чисел, но при задействования к ней функции подсчета елементом strlen - она выдает количество символов до первого встречающегося нуля, например: число в масиве g =102324 strlen выдаст 1 ,вопрос как сделать что-бы выдало 6 (т.е действительное количество)?
Проблемма решаема:
Цитата Сообщение от medVet Посмотреть сообщение
{char s[100],d[100],g[100];
clrscr();
for(int i=0; i<100; i++)// до начала использования масссива g[] заполняем его каким-нибудь символом, например 's'
g[i]='s';
cin>>s>>d;
slogenie(s,d,g); cout<<"\n";
int k;
// а здесь теперь подсчет
k=0;
while(g[k]!='s')
k++;
// теперь в k должно быть полное кол-во символов-цифр
//k=strlen(g); cout<<" k= "<<k<<" "; вот сдесь
for(int i=0;i<10;i++)
Yandex
Объявления
25.01.2010, 06:11     Сложение чисел ! недопуск на екзамен !
Ответ Создать тему
Опции темы

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