Доброе время суток!
Пишу программу для хэширования строк (свёртка 2).
#include <iostream>
#include <string.h>
using namespace std;
int hash_calc_sv2(char x[],const int size)
{
cout<<x<<" ";
int StringLength,HashKey,i,tmp;
StringLength=strlen(x); //Начало вычисления ключа
HashKey=0;
if (StringLength%2==0) //Чётный случай
{
cout<<"Ч ";
for (i=0; i<StringLength; i=i+2)
{
tmp=x[i];
tmp=tmp*1000;
tmp=tmp+x[i+1];
HashKey=HashKey+tmp;
}
}
if (StringLength%2!=0) //Нечётный случай
{
cout<<"Н ";
for (i=1; i<=StringLength; i=i+2)
{
tmp=x[i];
tmp=tmp*1000;
tmp=tmp+x[i+1];
HashKey=HashKey+tmp;
}
HashKey=HashKey+x[0];
} //конец вычисления ключа
//cout<<HashKey<<"\n";
return (HashKey);
}
int main(void)
{
int N=19;
char st[N][10];
int j,k,keyd[N],ht[N],ArrOfSin[N];
strcpy(st[0],"zero");
strcpy(st[1],"one");
strcpy(st[2],"two");
strcpy(st[3],"three");
strcpy(st[4],"four");
strcpy(st[5],"five");
strcpy(st[6],"six");
strcpy(st[7],"seven");
strcpy(st[8],"eight");
strcpy(st[9],"nine");
strcpy(st[10],"ten");
strcpy(st[11],"eleven");
strcpy(st[12],"twelve");
strcpy(st[13],"thirteen");
strcpy(st[14],"fourteen");
strcpy(st[15],"fifteen");
strcpy(st[16],"sixteen");
strcpy(st[17],"seventeen");
strcpy(st[18],"eighteen");
strcpy(st[19],"nineteen");
for (j=0; j<N; j++)
{
keyd[j]=hash_calc_sv2(st[j],strlen(st[j]));
cout<<keyd[j]<<"\n";
}
}
Хэш код всех строк считает правильно, за исключением двух. Это "three" и "six". Выдаёт каждый раз разное значение.
Тут представил вывод программы при каждом запуске (номер столбца - номер запуска)
zero Ч 236212 zero Ч 236212 zero Ч 236212 one Н 110212 one Н 110212 one Н 110212 two Н 119227 two Н 119227 two Н 119227 three Н 205236 three Н 205220 three Н 205240 four Ч 219225 four Ч 219225 four Ч 219225 five Ч 220206 five Ч 220206 five Ч 220206 six Н 105139 six Н 105107 six Н 105315 seven Н 202343 seven Н 202343 seven Н 202343 eight Н 209320 eight Н 209320 eight Н 209320 nine Ч 220206 nine Ч 220206 nine Ч 220206 ten Н 101232 ten Н 101232 ten Н 101232 eleven Ч 303336 eleven Ч 303336 eleven Ч 303336 twelve Ч 335328 twelve Ч 335328 twelve Ч 335328 thirteen Ч 438429 thirteen Ч 438429 thirteen Ч 438429 fourteen Ч 436436 fourteen Ч 436436 fourteen Ч 436436 fifteen Н 322415 fifteen Н 322415 fifteen Н 322415 sixteen Н 322426 sixteen Н 322426 sixteen Н 322426 seventeen Н 419655 seventeen Н 419655 seventeen Н 419655 eighteen Ч 421420 eighteen Ч 421420 eighteen Ч 421420
Попробовал осуществить всё без функции - считает однозначно. В чём проблема? |