Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Длинная арифметика 
:(
    Опции темы
rubaka
Дата 12.12.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 2.12.2010

Репутация: нет
Всего: нет



Суть программы: сложить два неотрицательных целых числа записанные в файле, не превышающих 10^100(10 в степени 100).

Код

#include <stdio.h>
main(){
FILE *in, *out;
in=fopen("input.txt","r");
out=fopen("output.txt","w");
int i,c,m;
const maxsize=101;
int a[maxsize], b[maxsize];
fscanf(in,"%d",&a);
fscanf(in,"%d",&b);
m=max(a[0],b[0]);
c=0;
for(i=0;i<m;i++){
c=c+a[i]+b[i];
a[i]=c%10;
c=c/=10;
}
a[0]=m;
if(c>0){
m=m+1;
a[m]=c;
}
fprintf(out,"%d",&a);
fclose(in);
fclose(out);
return 0;
}


Dev-C++ выдает
 In function `main': 
  [Linker error] undefined reference to `max' 
 ld returned 1 exit status 

В чем ошибка?

PM MAIL   Вверх
Crafty
Дата 12.12.2010, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Нету ф-ции max, её тебе нужно написать.
Код

int max(int a, int b)
{
  return (a > b) ? a : b;
}



Это сообщение отредактировал(а) Crafty - 12.12.2010, 23:34
PM MAIL   Вверх
rubaka
Дата 12.12.2010, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 2.12.2010

Репутация: нет
Всего: нет



Цитата(Crafty @ 12.12.2010,  23:28)
Нету ф-ции max, её тебе нужно написать.
Код

int max(int a, int b)
{
  return (a > b) ? a : b;
}

Спасибо, все компилится, но алгоритм не тот, или я где-то допустил ошибку..  Программа выдает 27594 заместо 5.
Просьба тому у кого 100+ постов добавить Crafty "+" к репутации. 

Это сообщение отредактировал(а) rubaka - 12.12.2010, 23:58
PM MAIL   Вверх
rubaka
Дата 13.12.2010, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 2.12.2010

Репутация: нет
Всего: нет



Код

#include <stdio.h>
main(){
FILE *in, *out;
in=fopen("input.txt","r");
out=fopen("output.txt","w");
int i,c,m;
const maxsize=101;
int a[maxsize], b[maxsize];
fscanf(in,"%d",&a);
fscanf(in,"%d",&b);
int max(int a, int b)
{
  return (a > b) ? a : b;
}
c=0;
for(i=0;i<m;i++){
c=c+a[i]+b[i];
a[i]=c%10;
c=c/=10;
}
a[0]=m;
if(c>0){
m=m+1;
a[m]=c;
}
fprintf(out,"%d",&a);
fclose(in);
fclose(out);
return 0;
}


Выводит не то что надо.. В чем ошибка? 
PM MAIL   Вверх
Crafty
Дата 14.12.2010, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Ф-цию max нужно добавить перед main
Код

#include <stdio.h>

int max(int a, int b)
{
  return (a > b) ? a : b;
}

main(){
FILE *in, *out;
in=fopen("input.txt","r");
out=fopen("output.txt","w");
int i,c,m;
const maxsize=101;
int a[maxsize], b[maxsize];
fscanf(in,"%d",&a);
fscanf(in,"%d",&b);
m=max(a[0],b[0]);
c=0;
for(i=0;i<m;i++){
c=c+a[i]+b[i];
a[i]=c%10;
c=c/=10;
}
a[0]=m;
if(c>0){
m=m+1;
a[m]=c;
}
fprintf(out,"%d",&a);
fclose(in);
fclose(out);
return 0;
}

PM MAIL   Вверх
Albor
Дата 14.12.2010, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(rubaka @  12.12.2010,  23:53 Найти цитируемый пост)
Спасибо, все компилится, но алгоритм не тот, или я где-то допустил ошибку..

Алгоритм "не тот". Вы допускаете ту же ошибку что и в задаче про кратность 7 - читаете длинное число в сравнительно короткий int. Вам нужно работать с символьными массивами. Складывать числа нужно "в столбик", начиная с младших разрядов. К чему применяется функция max вообще не понятно. 
PM MAIL ICQ   Вверх
rubaka
Дата 14.12.2010, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 2.12.2010

Репутация: нет
Всего: нет



Цитата(Crafty @  14.12.2010,  08:19 Найти цитируемый пост)
Ф-цию max нужно добавить перед main

Тоже самое

Добавлено через 5 минут и 9 секунд
Пример входного файла 2 3.
Выходной файл должен быть 5.. У меня 2293104
PM MAIL   Вверх
rubaka
Дата 14.12.2010, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 2.12.2010

Репутация: нет
Всего: нет



Цитата(Albor @ 14.12.2010,  18:20)
Цитата(rubaka @  12.12.2010,  23:53 Найти цитируемый пост)
Спасибо, все компилится, но алгоритм не тот, или я где-то допустил ошибку..

Алгоритм "не тот". Вы допускаете ту же ошибку что и в задаче про кратность 7 - читаете длинное число в сравнительно короткий int. Вам нужно работать с символьными массивами. Складывать числа нужно "в столбик", начиная с младших разрядов. К чему применяется функция max вообще не понятно.

Больше чужие алгоритмы не использую! Спасибо!  smile 
Поставьте ему "+"  smile 
PM MAIL   Вверх
rubaka
Дата 14.12.2010, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 2.12.2010

Репутация: нет
Всего: нет



Вот, что получается:

Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main()

int N, l;
char str1[100]; 
char str2[100]; 
char str3 [100];
FILE *in,*out;
in=fopen("input.txt","r");
out=fopen("output.txt","w");
fscanf(in,"%d",str1); 
itoa(N, str1, 10);
l = strlen(str1); 
fscanf(in,"%d",str2);
itoa(N, str2, 10); 
l=strlen(str2);

for(int j=0;j<l;j++) { 
str3[j]=str1[j]+str2[j]+1;
if(str3[j]>=10) { 
str3[j]=str3[j]; 

fprintf(out,"%d \n",str3); 


fclose(in);
fclose(out);
}

В строке ввода 2 3. В строке вывода 2293216. В чем ошибка?

Добавлено через 5 минут и 16 секунд
Код взят  отсюда
PM MAIL   Вверх
Albor
Дата 15.12.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Код

int main()
{
    FILE *in, *out;
    in=fopen("input.txt","r");
    out=fopen("output.txt","w");
    const int maxsize=101;
    char a[maxsize], b[maxsize], sum[maxsize];
    char *pA;
    char *pB;
    char *pSum;
    const char ZeroSym='0';

    fscanf(in,"%s",a);
    fscanf(in,"%s",b);
    int lenA=strlen(a);
    int lenB=strlen(b);
    pA=a+lenA-1;
    pB=b+lenB-1;
    pSum=sum;
    memset(sum,0,maxsize);
    char perenos=0;
    char tmpSum;
    while(pA>=a && pB>=b)
    {
        tmpSum=perenos+ *pA-ZeroSym + *pB-ZeroSym;
        perenos=tmpSum/10;
        tmpSum%=10;
        *pSum=tmpSum+ZeroSym;
        ++pSum;
        --pA;
        --pB;
    }

    fclose(in);
    fclose(out);
    return 0;
}

Сам доделаешь? Нужно разряды более длинного числа скопировать в массив суммы с учётом переноса. Результат в массиве sum находится в обратном порядке, то есть, либо выводить от конца, либо перевернуть строку, а затем вывести.
PM MAIL ICQ   Вверх
Albor
Дата 15.12.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Готовое решение
Код

int main()
{
    FILE *in, *out;
    in=fopen("input.txt","r");
    out=fopen("output.txt","w");
    const int maxsize=101;
    char a[maxsize], b[maxsize], sum[maxsize];
    char *pA;
    char *pB;
    char *pSum;
    const char ZeroSym='0';

    fscanf(in,"%s",a);
    fscanf(in,"%s",b);
    int lenA=strlen(a);
    int lenB=strlen(b);
    pA=a+lenA-1;
    pB=b+lenB-1;
    pSum=sum;
    memset(sum,0,maxsize);
    char perenos=0;
    char tmpSum;
    char tmpA;
    char tmpB;
    while(pA>=a || pB>=b)
    {
        tmpA=pA>=a?*pA:ZeroSym;// не закончилось ли слагаемое а
        tmpB=pB>=b?*pB:ZeroSym;// не закончилось ли слагаемое b
        tmpSum=perenos+ tmpA-ZeroSym + tmpB-ZeroSym;
        perenos=tmpSum/10;
        tmpSum%=10;
        *pSum=tmpSum+ZeroSym;
        ++pSum;
        --pA;
        --pB;
    }
    if(perenos)*pSum=perenos+ZeroSym;
    else --pSum;// сместимся с завершающего нуля
    //перевернём результат
    char *p=sum;

    while(pSum-p>0)
    {
        char t=*p;
        *p++=*pSum;
        *pSum--=t;

    }
    fprintf(out,"%s",sum);
    fclose(in);
    fclose(out);
    return 0;
}


Это сообщение отредактировал(а) Albor - 15.12.2010, 14:42
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0811 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.