Mam problem z udowodnieniem poprawności algorytmu do zadania:
Mamy dwie tablice T i S liczb całkowitych nieujemnych. Trzeba zbadać, czy istnieją takie indeksy w T (niech będzie to t) i S (ten indeks to s), żeby suma wszystkich elementów w T od 1 to t była
równa sumie elementów S od 1 do s.
Napisałem program, który wydaje się działać. Teraz jak mam udownodnić jego poprawność, czy poniższe rozumowanie będzie tu wystarczającym dowodem?
W pętli I (oznaczono komentarzem) niezmiennikiem jest to, że w T[lt] (lt- licznik tablicy t) przechowywana jest suma elementów tablicy T od 1 do lt (niezmiennik inicjuje się trywialnie, bo T[1] jest równe sumie wszyskich el. tablicy T od 1 do 1) Analogicznie w S. Drugim niezmiennikiem
jest to, że suma w tablicy T od 1 do k (k nalezy do zbioru{1,2..lt-1} jest różna od analogicznej sumy tablicy S (inicjacja trywialna bo T[0]!=S[0], po prostu nie ma elementów o indeksie 0).
Przy wyjściu z pętli mamy dwie możliwości:
- ls<10 i lt<10, wtedy znaleźliśmy już równe sumy i zadanie jest wykonane.
- ls=10 albo lt=10 wtedy przechodzimy do udowawniania poprawności Pętli II (i analogicznej Pętli III)...
Czy taki "dowód" jest ok? I czy niezmienniki są dobre?
#include <iostream>
#include <ctime>
using namespace std;
#define pauza system("pause");
/***************************************
** ZADANIE 33 **
** **
***************************************/
const int N=4;
int main(){
srand(time(0)); //losowanie tablic
int T[13],S[13];
for (int l=1;l<=N;l++) {T[l]=rand()%10+1;S[l]=rand()%10+1;};
for (int l=1;l<=N;l++) cout<<T[l]<<" "; //drukowanie tablic
cout <<endl;
for (int l=1;l<=N;l++) cout<<S[l]<<" ";
cout <<endl;
bool rownosc=false;
int lt=1,ls=1;
while (lt<N && ls<N){ //---------------PĘTLA I
if(T[lt]==S[ls]){ //T=S
printf("Sa rowne sumy dla indeksu tablicy T= %d i S= %d",lt,ls);
rownosc=true;
break;
}
if(T[lt]>S[ls]){ //T>S
ls++;
S[ls]+=S[ls-1];
continue;
}
if(T[lt]<S[ls]){ //T<S
lt++;
T[lt]+=T[lt-1];
continue;
}
}
while (lt<N && !rownosc){ //Tablica T jest niedokończona //---------------PĘTLA II
lt++;
T[lt]+=T[lt-1];
if (T[lt]==S[ls]){
printf("Sa rowne sumy dla indeksu tablicy T=%d i S=%d",lt,ls);
rownosc=true;
}
}
while (ls<N && !rownosc){ //Tablica S jest niedokończona //---------------PĘTLA III
ls++;
S[ls]+=S[ls-1];
if (T[lt]==S[ls]) {
printf("Sa rowne sumy dla indeksu tablicy T=%d i S=%d",lt,ls);
rownosc=true;
}
}
if (!rownosc) printf("Nie ma rownych sum");
pauza;
}