Реализации алгоритмов/Подсчёт счастливых билетов: различия между версиями
Содержимое удалено Содержимое добавлено
→Pascal: поправил комментарий |
Нет описания правки |
||
Строка 23: | Строка 23: | ||
out<<"Number of lucky tickets is "<<count<<endl; |
out<<"Number of lucky tickets is "<<count<<endl; |
||
out.close(); |
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> |
</source> |
Версия от 20:44, 8 июня 2012
C++
#include<fstream.h>
#include<process.h>
void main()
{
ofstream out;
out.open("LuckyTicket.txt",ios::out);
int i1,i2,i3,i4,i5,i6,count=0;
for(i1=0;i1<10;i1++)
for(i2=0;i2<10;i2++)
for(i3=0;i3<10;i3++)
for(i4=0;i4<10;i4++)
for(i5=0;i5<10;i5++)
for(i6=0;i6<10;i6++)
if(i1+i2+i3==i4+i5+i6)
{
out<<i1<<i2<<i3<<" "<<i4<<i5<<i6<<"\n";
count++;
}
out<<"Number of lucky tickets is "<<count<<endl;
out.close();
}
C++ с длинной арифметикой
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);
}
Ruby
n = 2 # 2n — кол-во цифр в билете
a = Array.new(n*9 + 1, 0)
('0'*n..'9'*n).each do |s|
sum = 0
s.each_byte {|c| sum += c - 48 }
a[sum] += 1
end
count = a.inject {|x, sum| x + sum**2 }
puts "Number of lucky tickets: #{count}"
Pascal
Program bilet;
Var s,a,b,v,z,i:integer; {s-количество счастливых билетов, a-сумма последних трех чисел, b-сумма первых трех чисел}
Begin
s:=1; {учитываем билет с номером 000000}
for i:=1 to 999999 do {перебираем билеты от 000001 до 999999}
begin
v:=i;
z:=0;
while z<3 do begin z:=z+1; a:=v mod 10 +a; v:=v div 10 end; {считаем сумму последних трех чисел}
while z<6 do begin z:=z+1; b:=v mod 10 +b; v:=v div 10 end; {считаем сумму первых трех чисел}
if a=b then s:=s+1;
a:=0;
b:=0;
end;
writeln(s);
end.