Siema!
Rozwiązuje zadanie na uczelnie gdzie trzeba dodać do siebie dwie liczby binarne, które mogą być różnej długości oraz w zapisie liczb nie ma zer wiodących, tzn. pierwszy bit każdej liczby jest równy 1, chyba że cała liczba jest równa 0 (jeden bit równy 0). Przykładowe wyjście:
Wejście:
2 // ilość zestawów (w każdym zestawie są 2 liczby binarne)
4 // długość 1 liczby binarnej
1 0 0 1 // jej postać binarna
2 //długość 2 liczby binarnej
1 1 // jej postać binarna
// \/ dalej ten sam proces dla kolejnych 2 liczb
4
1 1 1 1
6
1 1 1 1 1 1
Wyjście:
1100
1001110
Ogólnie tu jest mój kod i niestety z powodu złej odpowiedzi uczelniany system go nie przepuszcza, a przy testowaniu różnych wariantów wychodzi poprawna odpowiedź.
#include <stdio.h
int main(){
int d; //liczba zestawów
scanf("%d", &d);
int n, m, b1, b2; // n = dlugosc pierwszej binarnej / m = dl. drugiej / b1/b2 = postać binarna
int sum[10000];
int l;
int carry;
int r;
int d1[10000]; // tablica do przechowania binarnej, przesunięta o 1 indeks, np: zamiast 111111 było 0111111 - po to aby zrobić miejsce na ewentualne dodatkowe 1.
int d2[10000]; // tablica do przechowania binarnej, przesunięta o 1 indeks, np: zamiast 111111 było 0111111 - po to aby zrobić miejsce na ewentualne dodatkowe 1.
int p1[10000]; // tablica do przechowania binarnej
int p2[10000]; // tablica do przechowania binarnej
int f, g;
for(int i = 0; i < d; i++){
f = 0;
g = 0;
r = 0;
carry = 0;
scanf("%d", &n);
// int p1[10000];
for(int j = 0; j < n; j++){
scanf("%d", &b1);
p1[j] = b1;
}
scanf("%d", &m);
// int p2[10000];
for(int j = 0; j < m; j++){
scanf("%d", &b2);
p2[j] = b2;
}
if(n > m){
d1[0] = 0;
d2[0] = 0;
f = n + 1;
for(int j = 1; j <= m; j++)
d2[f - j] = p2[m - j];
for(int k = 1; k <= f; k++)
d1[f - k] = p1[f - k - 1];
for(int k = n; k > 0; k--){
if(d1[k]==0 && d2[k]==0 && carry==0){
sum[k] = 0;
carry = 0;
}
else if(d1[k]==0 && d2[k]==0 && carry==1){
sum[k] = 1;
carry = 0;
}
else if(((d1[k]==1 && d2[k]==0)||(d1[k]==0 && d2[k]==1)) && carry==0){
sum[k] = 1;
carry = 0;
}
else if(((d1[k]==1 && d2[k]==0)||(d1[k]==0 && d2[k]==1)) && carry==1){
sum[k] = 0;
carry = 1;
}
else if(d1[k]==1 && d2[k]==1 && carry==0){
sum[k] = 0;
carry = 1;
}
else if(d1[k]==1 && d2[k]==1 && carry==1){
sum[k] = 1;
carry = 1;
}
}
if(carry == 0){
for(int j = 1; j <= n; j++)
printf("%d", sum[j]);
}
if(carry == 1){
sum[0] = 1;
for(int s = 0; s <= n; s++)
printf("%d", sum[s]);
}
for(int z = 0; z < m + 2; z++){
p1[z] = 0;
p2[z] = 0;
d1[z] = 0;
d2[z] = 0;
sum[z] = 0;
}
}
//f = 0;
// g = 0;
// r = 0;
// carry = 0;
if(n < m){
d1[0] = 0;
d2[0] = 0;
g = m + 1;
for(int j = 1; j <= n; j++)
d1[g - j] = p1[n - j];
for(int k = 1; k <= g; k++)
d2[g - k] = p2[g - k - 1];
for(int k = m; k > 0; k--){
if(d1[k]==0 && d2[k]==0 && carry==0){
sum[k] = 0;
carry = 0;
}
else if(d1[k]==0 && d2[k]==0 && carry==1){
sum[k] = 1;
carry = 0;
}
else if(((d1[k]==1 && d2[k]==0)||(d1[k]==0 && d2[k]==1)) && carry==0){
sum[k] = 1;
carry = 0;
}
else if(((d1[k]==1 && d2[k]==0)||(d1[k]==0 && d2[k]==1)) && carry==1){
sum[k] = 0;
carry = 1;
}
else if(d1[k]==1 && d2[k]==1 && carry==0){
sum[k] = 0;
carry = 1;
}
else if(d1[k]==1 && d2[k]==1 && carry==1){
sum[k] = 1;
carry = 1;
}
}
if(carry == 0){
for(int j = 1; j <= m; j++)
printf("%i", sum[j]);
}
if(carry == 1){
sum[0] = 1;
for(int s = 0; s <= m; s++)
printf("%d", sum[s]);
}
for(int z = 0; z < m + 2; z++){
p1[z] = 0;
p2[z] = 0;
d1[z] = 0;
d2[z] = 0;
sum[z] = 0;
}
//f = 0;
//g = 0;
// r = 0;
//carry = 0;
}
if(n == m){
d1[0] = 0;
d2[0] = 0;
r = m + 1;
for(int j = 1; j <= n; j++){
d1[r - j] = p1[n - j];
d2[r - j] = p2[n - j];
}
for(int k = m; k > 0; k--){
if(d1[k]==0 && d2[k]==0 && carry==0){
sum[k] = 0;
carry = 0;
}
else if(d1[k]==0 && d2[k]==0 && carry==1){
sum[k] = 1;
carry = 0;
}
else if(((d1[k]==1 && d2[k]==0)||(d1[k]==0 && d2[k]==1)) && carry==0){
sum[k] = 1;
carry = 0;
}
else if(((d1[k]==1 && d2[k]==0)||(d1[k]==0 && d2[k]==1)) && carry==1){
sum[k] = 0;
carry = 1;
}
else if(d1[k]==1 && d2[k]==1 && carry==0){
sum[k] = 0;
carry = 1;
}
else if(d1[k]==1 && d2[k]==1 && carry==1){
sum[k] = 1;
carry = 1;
}
}
if(carry == 0){
for(int j = 1; j <= m; j++)
printf("%d", sum[j]);
}
if(carry == 1){
sum[0] = 1;
for(int s = 0; s <= m; s++)
printf("%d", sum[s]);
}
for(int z = 0; z < n + 2; z++){
p1[z] = 0;
p2[z] = 0;
d1[z] = 0;
d2[z] = 0;
sum[z] = 0;
}
}
//for(int z = 0; z < n + m; z++){
// p1[z] = 0;
// p2[z] = 0;
// d1[z] = 0;
// d2[z] = 0;
// sum[z] = 0;
// }
}
}
Macie może jakiś pomysł jak to poprawić?