Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Длинная арифметика


Автор: rubaka 12.12.2010, 23:12
Суть программы: сложить два неотрицательных целых числа записанные в файле, не превышающих 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 

В чем ошибка?

Автор: Crafty 12.12.2010, 23:28
Нету ф-ции max, её тебе нужно написать.
Код

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


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

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

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

Автор: rubaka 13.12.2010, 23:54
Код

#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;
}


Выводит не то что надо.. В чем ошибка? 

Автор: Crafty 14.12.2010, 08:19
Ф-цию 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;
}

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

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

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

Тоже самое

Добавлено через 5 минут и 9 секунд
Пример входного файла 2 3.
Выходной файл должен быть 5.. У меня 2293104

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

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

Больше чужие алгоритмы не использую! Спасибо!  smile 
Поставьте ему "+"  smile 

Автор: rubaka 14.12.2010, 22:26
Вот, что получается:

Код

#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 секунд
Код взят  http://lom.at.ua/publ/tochnoe_slozhenie_i_vychitanie_chisel_v_stolbik_algoritm_realizovan_na_s/1-1-0-1

Автор: Albor 15.12.2010, 13:26
Код

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 находится в обратном порядке, то есть, либо выводить от конца, либо перевернуть строку, а затем вывести.

Автор: Albor 15.12.2010, 14:41
Готовое решение
Код

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;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)