Реализации алгоритмов/Подсчёт счастливых билетов: различия между версиями

Содержимое удалено Содержимое добавлено
→‎Pascal: поправил комментарий
Нет описания правки
Строка 23:
out<<"Number of lucky tickets is "<<count<<endl;
out.close();
}
</source>
== C++ с длинной арифметикой ==
<source lang="сpp">
void inline count_lucky(unsigned int num_length_val)
{
bool is_odd = (num_length_val % 2) > 0;
unsigned int num_length = (is_odd) ? num_length_val - 1 : num_length_val;
register unsigned int lucky=1, total=pow(10.0,(int)num_length), i;
char *num = new char[num_length], *end=num+(num_length-1);
register char *pos=end;
for(i=0; i < num_length; i++)
num[i]=0;
while(pos>=num)
{
if((*pos)<9)
{
(*pos)++;
if(pos==end)
{
if(is_lucky((unsigned char*)num, num_length))
lucky++;
}
else
pos++;
}
else
{
*pos=-1;
pos--;
}
}
printf("Lucky are %d of %d (%.3f%%)\n",(is_odd) ? lucky * 10 : lucky, (is_odd) ? total * 10 : total,((float)lucky/total*100));
delete[] num;
}
bool inline is_lucky(unsigned char* items, unsigned int items_count)
{
unsigned char val1=0, val2=0;
unsigned int half = items_count >> 1;
for(unsigned int i=0; i < half; i++)
{
val1 += items[i];
val2 += items[items_count-1-i];
}
return (val1==val2);
}
</source>