C programming language

2 отговора 0 прегледа
#1

C programming language

Kakvo e re6enieto na slednata zada4a? Molq pomognete!
Dadeni sa 2 stringa s daljina po 32kb. Vseki ot tqh se sastoi samo ot deseti4ni tzifri. da se napi6e funkzia koqto sabira dvete 4isla koito se sadarjat v stringovete.

Отговор
в отговор на lamer_programist #2

Re6enie no s problem!!!

Тук съм реализирал решението като програма но може съвсем спокойно функцията main
да се преобразува във функция която приема три параметъра. Първите два са
стринговете, а последният е само указател към низ който да се запълни.

/*------------------------------- zadacha_edno.c ---------------------------------------*/
/*
Дадени са 2 стринга с дълйина по 32kb.
Всеки от тях се състои само от десетични цифри.
Да се напи6е функция която събира двете числа които се съдържат в стринговете.
*/

/*
Програмата работи по следния начин.
Взимат се двата низа от командния ред или се въвеждат последователно,
след което се обръщат огледално. Нещо като преминаване от big-endian
към litle-endian подредба на числата. След това сумираме цифрите и записваме
резултата в променлива *sum*, след като сме сумирали две цифри изваждаме от
тяхната сумирана char стойност 0x30 или '0', и проверяваме дали съответният
char е по-голям от 0x39 или '9'. Ако е така записваме в променливата *izl*
на позиция с единица по-голяма от текущата на стринговете char-ат 0x31 или '1'.
като не пропускаме да извадим от char-ат по-голям от 0x39 числото 10.
След като преминем през всички цифри, копираме стринговете *sum* и *izl*
съответно в ao и bo. И присвояваме на всеки char от стринговете *sum* и *izl*
съответно 0x30 или '0' и продължаваме да итерираме, докато *izl*, не стане
само нули.

Променливи:
a, b - Копирани от командния ред или въведени от потребителя
ao, bo - обърнатите от invert_word(), стринговете a и b
la, lb - дължини a и b
l - по-голямата измежду la и lb, събрана с единица
i, j - итерационни променливи
sum - сума
izl - излишък
res - в нея запазваме резултата
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LENGTH 32<<10

int ne_e_samo_nuli(char *ptr);
void invert_word(char *src, char *dest);

int main (int argc, char *argv[]) {
char *a, *b;
char *ao, *bo;
char *sum, *izl, *res;
int i, la, lb, l, j;

if(argc == 3) {
a = (char *) malloc(strlen(argv[1])+1);
strcpy(a, argv[1]);
} else {
printf("%s", "Vavedete chislo 1: ");
a = (char *) malloc(MAX_LENGTH);
gets(a);
}
la = strlen(a);

if(argc == 3) {
b = (char *) malloc(strlen(argv[2])+1);
strcpy(b, argv[2]);
} else {
printf("%s", "Vavedete chislo 2: ");
b = (char *) malloc(MAX_LENGTH);
gets(b);
}
lb = strlen(b);

l = la >= lb ? la+1 : lb+1;

sum = (char *) malloc(l);
res = (char *) malloc(l);
izl = (char *) malloc(l);
ao = (char *) malloc(l);
bo = (char *) malloc(l);

for(i = 0; i<l; i++) {
sum = '0';
izl = '0';
ao = '0';
bo = '0';
}

invert_word(a, ao);
invert_word(b, bo);

while(ne_e_samo_nuli(bo)) {
for(i=0; i<l; i++) {
if (ao >= 0x30 && ao <= 0x39) {
sum = ao + bo ;
sum -= '0';
if(sum > '9') {
sum -= 10;
izl[i+1] = '1';
} else {
izl[i+1] = '0';
}
}
}

for(i = 0; i<l; i++) {
ao = sum;
bo = izl;
}

for(i = 0; i<l; i++) {
sum = '0';
izl = '0';
}
}

invert_word(ao, res);
printf("Sborat e: %s\n", res);

free(ao);
free(bo);
free(sum);
free(izl);
free(rez);
free(a);
free(b);

return 0;
}

void invert_word(char *src, char *dest)
{
int i, l;
l = strlen(src);

for(i=0; i<l; i++)
dest = '0';

for(i=0; i<l; i++) {
dest[l-i-1] = src;
}

dest[l] = 0;

}

int ne_e_samo_nuli(char *ptr)
{
int ret = 0;
int i;

for(i=0; i<strlen(ptr); i++)
if( ptr != '0' ) {
ret = 0x74;
break;
}

return ret;
}

/////////////////////////////////////////////////////////////////////
Въпреки всичките усилия които хвърлих не успях да разбера защо
програмата не може да събира стрингове които са с дължина съответно
3:3, 4:4, 5:5, 3:4 и някои други единични случаи. Моля някой друг да
разгледа програмата и ако може да пусне отговор на моя въпрос. За
напътствие мога само да кажа 4е проблемът е някъде в цикъла while при
проверката на bo след като копирали izl. По някаква причина
променливата izl не е само нули или единици и нули дори когато сме
събрали числа в които няма вероятност да я запълним изобщо с нещо.
Например 444+555 Моля някой да помогне в по-нататъшното решаване
на задачата

ИСКРЕННО ВАШ thegold_u thegold_u@dir.bg

Отговор
в отговор на thegold_u #3

Re: На един ред мом[ко/е] :)

Немаме информация за терминиращи символи. :)

#define SZ32K 0x00008000

char add_32K( char sr[SZ32K], const char sa[SZ32K], const char sb[SZ32K] ) {
int n;
char cc, cv;

for( n = SZ32K, cc = 0; n--; sr[n] = cv - ( ( cc = cv > '9' ) ? 10 : 0 ) )
cv = cc + sa[n] + sb[n] - '0';

return cc + '0';
}

Теоретично требе да работи.

Отговор