Witam
Rzowiązuje zadanie Kalkulator IP (http://pl.spoj.pl/problems/MWP2_1B/) ze SPOJa.
Napisałem taki kod:
#include<iostream>
using namespace std;
int d, ip, i0, b1, b2, b3, b4, s1, s2, s3, s4, wart[32], il;
bool host[32], maska[32], siec[32], broadcast[32];
int main()
{
wart[0]=1;
for(i0=1; i0<=31; i0++) wart[i0]=wart[i0-1]*2;
cin >> d;
for(int i=0; i<d; i++)
{
cin >> ip;
i0=7;
do
{
if(ip%2==1) host[i0]=1; else host[i0]=0;
ip/=2;
i0--;
} while(ip>0);
cin >> ip;
i0=15;
do
{
if(ip%2==1) host[i0]=1; else host[i0]=0;
ip/=2;
i0--;
} while(ip>0);
cin >> ip;
i0=23;
do
{
if(ip%2==1) host[i0]=1; else host[i0]=0;
ip/=2;
i0--;
} while(ip>0);
cin >> ip;
i0=31;
do
{
if(ip%2==1) host[i0]=1; else host[i0]=0;
ip/=2;
i0--;
} while(ip>0);
cin >> ip;
i0=7;
do
{
if(ip%2==1) maska[i0]=1; else maska[i0]=0;
ip/=2;
i0--;
} while(ip>0);
cin >> ip;
i0=15;
do
{
if(ip%2==1) maska[i0]=1; else maska[i0]=0;
ip/=2;
i0--;
} while(ip>0);
cin >> ip;
i0=23;
do
{
if(ip%2==1) maska[i0]=1; else maska[i0]=0;
ip/=2;
i0--;
} while(ip>0);
cin >> ip;
i0=31;
do
{
if(ip%2==1) maska[i0]=1; else maska[i0]=0;
ip/=2;
i0--;
} while(ip>0);
for(i0=0; i0<32; i0++)
{
broadcast[i0]=host[i0] | (!maska[i0]);
siec[i0]=maska[i0] & host[i0];
}
if(broadcast[31]) b4+=1;
if(broadcast[30]) b4+=2;
if(broadcast[29]) b4+=4;
if(broadcast[28]) b4+=8;
if(broadcast[27]) b4+=16;
if(broadcast[26]) b4+=32;
if(broadcast[25]) b4+=64;
if(broadcast[24]) b4+=128;
if(broadcast[23]) b3+=1;
if(broadcast[22]) b3+=2;
if(broadcast[21]) b3+=4;
if(broadcast[20]) b3+=8;
if(broadcast[19]) b3+=16;
if(broadcast[18]) b3+=32;
if(broadcast[17]) b3+=64;
if(broadcast[16]) b3+=128;
if(broadcast[15]) b2+=1;
if(broadcast[14]) b2+=2;
if(broadcast[13]) b2+=4;
if(broadcast[12]) b2+=8;
if(broadcast[11]) b2+=16;
if(broadcast[10]) b2+=32;
if(broadcast[9]) b2+=64;
if(broadcast[8]) b2+=128;
if(broadcast[7]) b1+=1;
if(broadcast[6]) b1+=2;
if(broadcast[5]) b1+=4;
if(broadcast[4]) b1+=8;
if(broadcast[3]) b1+=16;
if(broadcast[2]) b1+=32;
if(broadcast[1]) b1+=64;
if(broadcast[0]) b1+=128;
if(siec[31]) s4+=1;
if(siec[30]) s4+=2;
if(siec[29]) s4+=4;
if(siec[28]) s4+=8;
if(siec[27]) s4+=16;
if(siec[26]) s4+=32;
if(siec[25]) s4+=64;
if(siec[24]) s4+=128;
if(siec[23]) s3+=1;
if(siec[22]) s3+=2;
if(siec[21]) s3+=4;
if(siec[20]) s3+=8;
if(siec[19]) s3+=16;
if(siec[18]) s3+=32;
if(siec[17]) s3+=64;
if(siec[16]) s3+=128;
if(siec[15]) s2+=1;
if(siec[14]) s2+=2;
if(siec[13]) s2+=4;
if(siec[12]) s2+=8;
if(siec[11]) s2+=16;
if(siec[10]) s2+=32;
if(siec[9]) s2+=64;
if(siec[8]) s2+=128;
if(siec[7]) s1+=1;
if(siec[6]) s1+=2;
if(siec[5]) s1+=4;
if(siec[4]) s1+=8;
if(siec[3]) s1+=16;
if(siec[2]) s1+=32;
if(siec[1]) s1+=64;
if(siec[0]) s1+=128;
i0=31;
do i0--; while(!maska[i0]);
i0=32-i0;
if(host[0] && host[1] && host[2]) il=0; else il=wart[i0-1]-2;
cout << il << "\n";
if(il!=0) cout << s1 << "." << s2 << "." << s3 << "." << s4+1 << " " << b1 << "." << b2 << "." << b3 << "." << b4-1 << "\n";
b1=0;
b2=0;
b3=0;
b4=0;
s1=0;
s2=0;
s3=0;
s4=0;
for(i0=0; i0<=31; i0++)
{
maska[i0]=0;
host[i0]=0;
siec[i0]=0;
broadcast[i0]=0;
}
}
}
Niestety odpowiedź jest zła. Szukam błędu już jakiś czas ale niestety nie mogę znaleźć :)
Wyliczam adres sieci i broadcast. Jako adres pierwszego hostu wyświetlam adres sieci ze zwiększonym o 1 ostatnim oktecie adresu sieci, a jako ostatni adres wyświetlam broadcast ze zmniejszonym o jeden ostatnim oktetem. Licze też ile bitów w masce jest równych 0 i na tej podstawie wyliczam ilośc hostów w sieci (2^ilość_bitów_zerowych - 2). Dodatkowa dla klas D i E adresów IP (pierwsze 3 bity adresu hosta równe 111) wypisuje zero hostów. Mimo to program nie działa tak jak należy.
Za znalezienie błędu będę bardzo wdzięczny
Pozdrawiam