Dorzuciłem kilka linii, ale coś jest nadal nie tak, wydaje mi się, ze chodzi tutaj o parzystość/nieparzystość zapisu liczby binarnej..
Kopiuj
int linie=0;
while(linie<1000)
{
fgets(tab,201,plik);
Last=strlen(tab)-2;
if(tab[Last]=='0') P_2++;
if(tab[Last]=='0' && tab[Last-1]=='0') suma_5=0; //ustanawia sumę ostatnich 2 elementów
if(tab[Last]=='1' && tab[Last-1]=='1') suma_5=3;
if(tab[Last]=='1' && tab[Last-1]=='0') suma_5=1;
if(tab[Last]=='0' && tab[Last-1]=='1') suma_5=2;
for(i=0;i<strlen(tab);i+=2)
{
if(tab[i]=='1') N_parz++;
if(tab[i+1]=='1') Parz++;
}
for(j=strlen(tab)-2;i<=0;i-=2) // pętla od ostatniego elementu
{
if(tab[j]=='0' && tab[j-1]=='0') suma_5-=0; /odejmowanie kolejnych elementów od sumy
if(tab[j]=='1' && tab[j-1]=='1') suma_5-=3;
if(tab[j]=='1' && tab[j-1]=='0') suma_5-=1;
if(tab[j]=='0' && tab[j-1]=='1') suma_5-=2;
}
roznica=Parz-N_parz;
printf("nieparz- %d parz-%d roznica- %d last - %c last-1 - %c suma-%d\n",N_parz,Parz,roznica,tab[Last],tab[Last-1], suma_5);
if(roznica%3==0) P_3++;
if(suma_5%5==0) P_5++;
N_parz=0;
Parz=0;
linie++;
}
A tutaj mam cały kod, który opracowała CKE w C++ :) Całkiem inaczej to zrobione, nie za bardzo kminię o co chodzi z tym modulo p, ale wygląda to na podobne rozwiązanie do mojego pierwotnego..
Kopiuj
#include <iostream>
#include <string>
using namespace std;
int reszta(string b, int p){
const char zero = '0';
int dl = b.length(); //obliczenie długości zapisu liczby b
int d = 0; //po zakończeniu obliczeń wartością d będzie wartość dziesiętna
//liczby b modulo p
// schemat Hornera modulo p
for (int j = 0; j < dl; j++){
int cyfra = b[j] - zero; //odzyskanie kolejnej cyfry liczby b
//poczynając od najbardziej znaczącej
d = (d * 2 + cyfra) % p; //% jest operatorem modulo w C++
}
return d;
}
int main(){
string liczba;
const int n = 1000; //rozmiar danych
int podz_2 = 0, podz_3 = 0, podz_5 = 0; // podz_p - liczba liczb
// podzielnych przez p
for (int i = 0; i < n; i++){
cin >> liczba; //wczytanie kolejnej liczby;
if (reszta(liczba, 2) == 0) podz_2++;
if (reszta(liczba, 3) == 0) podz_3++;
if (reszta(liczba, 5) == 0) podz_5++;
}
cout << "podzielne przez " << 2 << " : " << podz_2 << endl;
cout << "podzielne przez " << 3 << " : " << podz_3 << endl;
cout << "podzielne przez " << 5 << " : " << podz_5 << endl;
return 0;
}