Ruby/Практикум/Числа
Материал из Викиучебника
[править] Числа
[править] Дано четырехзначное целое число. Необходимо проверить, является ли оно числом Армстронга.
Возможное решение:
n = 1234 b = n%10 c = n/10%10 d = n/100%10 e = n/1000 b**4 + c**4 + d**4 + e**4 == n
Замечания по решению:
Возможное решение:
n=1634 p n == n.to_s.split(//).inject(0){|s,e| s+e.to_f**4}
Замечания по решению:
[править] Идет k-я секунда года. Необходимо определить сколько полных месяцев и полных недель осталось до конца года.
Возможное решение:
k = 12312 s = 365*24*60*60 m = (s-k)/(30*24*60*60) n = (s-k)/(7*24*60*60)
Замечания по решению: решение дано для задачи сколько полных месяцев или полных недель осталось до конца года исправить нетрудно(см. задачу 1.42) мой вариант(месяц=28 дней, в месяце 4 недели)
Возможное решение:
k=12312345 temp=(28*12*24*60*60-k)/24/60/60 puts "#{temp/7/4} полных месяцев и #{temp/7%4} полных недель"
[править] Даны два числа. Необходимо найти их среднее геометрическое.
Возможное решение:
Math.sqrt(x*y)
Замечания по решению:
[править] Дано целое шестизначное число. Необходимо определить, является ли оно счастливым.
Возможное решение:
# xyzabc -- шестизначное число n = 123456 c = n%10 bc = n%100 b = bc/10 abc = n%1000 a = abc/100 zabc = n%10000 z = zabc/1000 yzabc = n%100000 y = yzabc/10000 x = n/100000 x+y+z == a+b+c
Замечания по решению:
Возможное решение:
# xyzabc -- шестизначное число n = 123456 s = n.to_s (s[0,1].to_i+s[1,1].to_i+s[2,1].to_i) == (s[3,1].to_i+s[4,1].to_i+s[5,1].to_i)
Замечания по решению:
Возможное решение:
n=123411 tmp=[] n.to_s.split(//).each_slice(3){|e| tmp << eval(e.join('+'))} p tmp.uniq.size==1
Замечания по решению:
Возможное решение:
n=237372 p (n/(10**((n.to_s.size)/2))).to_s.split("").map { |x| x.to_i }.inject(0) { |sum,x| sum+x }==(n%(10**((n.to_s.size)/2))).to_s.split("").map { |x| x.to_i }.inject(0) { |sum,x| sum+x }
Замечания по решению:
[править] Дано трехзначное число. Необходимо проверить, образуют ли цифры этого числа возрастающую последовательность.
Возможное решение:
b = 123 a = b%10 c = b%100/10 d = b/100 q = (a<c) f = (c<d) p(q&&f)
Замечания по решению:
Возможное решение:
x=546 a=x/100 b=x/10%10 c=x%10 (a<b)&&(b<c)
Замечания по решению:
Возможное решение:
p ((a/100)<(a/10%10))&&((a/10%10)<(a%10))
Замечания по решению:
Возможное решение:
n=123 m1=n.to_s.split(//) p m1==m1.sort
Замечания по решению:
[править] Дано натуральное число меньшее 512. Необходимо проверить, является ли оно счастливым в двоичном представлении.
Возможное решение:
x = 165 (x[0] + x[1] + x[2] + x[3]).eql?(x[5] + x[6] + x[7] + x[8])
Замечания по решению:
[править] Даны координаты некоторой точки A (на плоскости). Необходимо найти расстояние от точки A до начала координат.
Возможное решение:
Math.sqrt(a**2+b**2)
Замечания по решению:
[править] Даны коэффициенты линейного уравнения: A и B . Необходимо найти корень этого уравнения.
Возможное решение:
a,b = 1,3 x = -b.to_f/a
Замечания по решению: команда .to_f(перевод в формат числа с плавающей точкой) использована для универсальности, потому что иначе мы получим только целочисленное деление, а коэффициент по заданию может оказаться с плавающей точкой
[править] Дано трехзначное число. Необходимо проверить, образуют ли цифры этого числа убывающую последовательность.
Возможное решение:
b=479 x=a/100 y=a/10%10 z=a%10 (x>y)&&(y>z)
Замечания по решению:
Возможное решение:
n=321 m1=n.to_s.split(//) p m1==m1.sort.reverse
Замечания по решению:
[править] Дано четырехзначное число. Необходимо проверить, различны ли все четыре цифры этого числа.
Возможное решение:
a = 3456 b = a/10 c = a%10 d = b%10 e = b/10 g = e%10 n = e/10 p( (n!=g)&&(n!=d)&&(n!=c)&&(g!=d)&&(g!=c)&&(d!=c) )
Замечания по решению:
Возможное решение:
n=1524 m=n.to_s.split(//) p m.uniq==m
Замечания по решению:
[править] Даны координаты двух полей шахматной доски. Необходимо определить, имеют ли эти поля одинаковый цвет.
Возможное решение:
x1,y1,x2,y2 = 1,2,3,4 ((x1+x2+y1+y2)%2).zero?
Замечания по решению:
Возможное решение:
((x1+y1)%2).eql?((x2+y2)%2)
Замечания по решению:
[править] Дано трехзначное число. Необходимо определить есть ли среди цифр этого числа хотя бы две одинаковых.
Возможное решение:
b = 123 a = b%10 d = b%100/10 c = b/100 l = (a==d) n = (d==c) l || n
'Замечания по решению:'А где проверка (a==c)??
Возможное решение:
x=321 a=x/100 b=x/10%10 c=x%10 (a==b)||(b==c)||(a==c)
Замечания по решению:
Возможное решение:
n=121 p (n/100==n%10)||(n/100==n%100/10)||(n%100/10==n%10)
Замечания по решению:
Возможное решение:
n=121 p n.to_s.split(//).uniq.size < 3
Замечания по решению:
[править] Дано натуральное число меньшее 256. Необходимо найти сумму всех нечетных битов этого числа.
Возможное решение:
x[1]+x[3]+x[5]+x[7]
Замечания по решению:
[править] Идет k-я секунда суток. Необходимо определить сколько полных часов и полных минут прошло с начала суток.
Возможное решение:
h=k/3600 m=k%60
Замечания по решению:
[править] Дано целое число. Необходимо определить, является ли оно четным.
Возможное решение:
(a%2).zero?
Замечания по решению:
Возможное решение:
n[0].zero?
Замечания по решению:
[править] Даны три числа. Необходимо найти их среднее геометрическое.
Возможное решение:
(a*b*c)**Rational(1,3)
Замечания по решению:
[править] Даны координаты двух полей шахматной доски. Необходимо определить, может ли конь добраться из одного поля в другое за один ход.
Возможное решение:
(i1.abs<3)&&(i2.abs<3)&&(j1.abs<3)&&(j2.abs<3)&&((i1-i2).abs+(j1-j2).abs == 3)
Замечания по решению:
Возможное решение:
x1, x2, y1, y2 = 1, 2, 3, 4 p( ((x1 == x2-2) && (y1 == y2-1)) || ((x1 == x2+2) && (y1 == y2-1)) || ((x1 == x2+2) && (y1 == y2+1)) || ((x1 == x2-2) && (y1 == y2+1)) || ((x1 == x2-1) && (y1 == y2-2)) || ((x1 == x2-1) && (y1 == y2+2)) || ((x1 == x2+1) && (y1 == y2-2)) || ((x1 == x2+1) && (y1 == y2+2)) )
Замечания по решению:
Возможное решение:
x1,y1,x2,y2=1,5,3,6 p Math.sqrt((x1-x2)**2+(y1-y2)**2)==Math.sqrt(5)
Замечания по решению:
[править] Даны коэффициенты квадратного уравнения: A, B и С. Необходимо найти корни этого уравнения.
Возможное решение:
a = 5 b = 6 c = 10 d = b**2 - 4*a*c p x1 = (-b + d**Rational(1,2)) / (2*a) p x2 = (-b - d**Rational(1,2)) / (2*a)
Замечания по решению:
[править] Дано целое четырехзначное число. Необходимо проверить является ли оно счастливым.
Возможное решение:
a = 6455 b = a/10 c = a%10 d = b%10 e = b/10 g = e%10 n = e/10 ( n+g ).eql?( d+c )
Замечания по решению:
Возможное решение:
a=5234 puts ((a.to_s[0].to_i+a.to_s[1].to_i)==(a.to_s[2].to_i+a.to_s[3].to_i))
Замечания по решению:
[править] Даны координаты трех полей шахматной доски. Необходимо определить, имеют ли эти поля одинаковый цвет.
Возможное решение:
x1,x2,x3,y1,y2,y3 = 1,2,4,2,3,5 a = (x1+y1)[0] b = (x2+y2)[0] c = (x3+y3)[0] (a == b)&&(b == c)&&(c == a)
Замечания по решению:
Возможное решение:
x1,x2,x3,y1,y2,y3=1,4,2,7,4,6 p (x1+x2+y1+y2)[0]==(x1+x3+y1+y3)[0]
Замечания по решению:
[править] Даны коэффициенты биквадратного уравнения: A, B и С. Необходимо найти корни этого уравнения.
Возможное решение:
d=(b**2)-(4*a*c) t1=-b+Math.sqrt(d) t2=-b-Math.sqrt(d) x1=-Math.sqrt(t1) x2=Math.sqrt(t1) x3=-Math.sqrt(t2) x4=Math.sqrt(t2)
Замечания по решению:
Возможное решение:
a = 2; b = 4; c = 8 d = b**2 - 4*a*c t1 = (-b + Math.sqrt(d)) / (2*a) t2 = (-b - Math.sqrt(d)) / (2*a) x1 = -Math.sqrt(t1); x2 = Math.sqrt(t1); x3 = -Math.sqrt(t2); x4 = Math.sqrt(t2);
Замечания по решению:
[править] Дано пятизначное число. Необходимо получить число, которое получается перестановкой цифр исходного в обратном порядке.
Возможное решение:
a = 12345 b = a%10 c = a/10%10 d = a/100%10 e = a/1000%10 f = a/10000 f*10000 + e*1000 + d*100 + c*10 + b
Замечания по решению:
Возможное решение:
s=12345 s.to_s.reverse.to_i
Замечания по решению:
[править] Дано пятизначное число. Необходимо проверить, образуют ли цифры этого числа, стоящие на нечетных позициях, возрастающую последовательность.
Возможное решение:
x = 63517 a = x/10000 b = x/1000 - a*10 c = x/100 - (a*100 + b*10) d = x/10 - (a*1000 + b*100 + c*10) e = x - (a*10000 + b*1000 + c*100 + d*10) p( (a < c)&&(c < e) )
Замечания по решению:
Возможное решение:
a=12243 p (a/10000<a/100%10)&&(a/100%10<a%10)
Замечания по решению:
[править] Дано натуральное число меньшее 256. Необходимо проверить, равенство первых и последних 4 бит этого числа.
Возможное решение:
(x[0]==x[4])&&(x[1]==x[5])&&(x[2]==x[6])&&(x[3]==x[7])
Замечания по решению:
[править] Дано четырехзначное число. Необходимо определить есть ли среди цифр этого числа хотя бы две одинаковых.
Возможное решение:
x = 1234 a = x/1000 b = x/100%10 c = x%100/10 d = x%10 a==b || b==c || c==d || a==d || b==d || a==c
Замечания по решению:
Возможное решение:
x = 1652 p x.to_s.split("")!=x.to_s.split("").uniq
Замечания по решению:
[править] Дано натуральное число меньшее 256. Необходимо найти сумму всех четных битов этого числа.
Возможное решение:
(x&2**0)+(x&2**2)+(x&2**4)+(x&2**6)
Замечания по решению: не очень понятно, что искалось?
Возможное решение:
a=143 p a[0]+a[2]+a[4]+a[6]
Замечания по решению:
[править] Даны коэффициенты биквадратного уравнения: A, B и С. Необходимо найти произведение корней этого уравнения.
Возможное решение:
a,b,c = 1,-4,1 d = b**2 - 4*a*c z1 = (-b-Math.sqrt(d))/(2*a) z2 = (-b+Math.sqrt(d))/(2*a) x1 = Math.sqrt(z1) x2 = -Math.sqrt(z1) x3 = Math.sqrt(z2) x4 = -Math.sqrt(z2) p x1,x2,x3,x4
Замечания по решению:
Возможное решение:
A,B,C=1,-7,12 p C
Замечания по решению:
[править] Дано натуральное число меньшее 16. Необходимо проверить, является ли оно двоичным полиндромом.
Возможное решение:
x = 14 (x[0] == x[3]) && (x[1] == x[2])
Замечания по решению:
Возможное решение:
x = 15 p( (x[0]==x[3])&&(x[1]==x[2]) )
Замечания по решению:
Возможное решение:
a=9.to_s(2) p a==a.reverse
Замечания по решению:
[править] Даны координаты двух полей шахматной доски. Необходимо определить, может ли слон добраться из одного поля в другое за один ход.
Возможное решение:
x1, x2, y1, y2 = 1, 2, 3, 4 p( (x1-x2).abs == (y1-y2).abs )
Замечания по решению:
Возможное решение:
a1=1; a2=4; b1=3; b2=2 p( (b1-a1).abs==(b2-a2).abs )
Замечания по решению:
[править] Даны три числа. Необходимо найти их среднее арифметическое.
Возможное решение:
a=3 b=4 c=6 p (a+b+c)/3.0
Замечания по решению: Если вместо 3.0 будет просто 3, выводиться как среднее арифметичское будет 4. Правильный ответ 4.(3)
[править] Дано трехзначное число. Необходимо определить есть ли среди цифр этого числа ровно две одинаковых.
Возможное решение:
x = 121 a=x/100; b=x/10%10; c=x%10 p ((b==a)&&(b!=c)&&(c!=a))||((b==c)&&(b!=a)&&(c!=a))||((a==c)&&(a!=b)&&(c!=b))
Замечания по решению:
Возможное решение:
x = 911 a = x/100 b = x/10%10 c = x%10 p( ((a==b)&&(a!=c)&&(b!=c))||((b==c)&&(a!=c)&&(a!=b))||((a==c)&&(a!=b)&&(b!=c)) )
Замечания по решению:
Возможное решение:
n=121 m=n.to_s.split(//) p m.uniq.size == 2
Замечания по решению:
[править] Дано четырехзначное целое число. Необходимо проверить, является ли оно счастливым.
Возможное решение:
a = 1234 b = a%10 c = a/10 e = c%10 d = c/10 g = d%10 m = d/10 (m + g) == (e + b)
Замечания по решению:
Возможное решение:
d=3214 a=d/1000 b=d/100-a*10 c=d/10-(a*100+b*10) r=d-(a*1000+b*100+c*10) a+b==c+r
Замечания по решению:
[править] Дано трехзначное число. Необходимо получить число, которое получается перестановкой цифр исходного в обратном порядке.
Возможное решение:
m=123 a=m/100 b=(m-a*100)/10 c=(m-a*100-b*10) p (c*100)+(b*10)+a
Замечания по решению:
Возможное решение:
d=123 a=d/100 b=d/10-a*10 c=d-(a*100+b*10) c*100+b*10+a
Замечания по решению:
Возможное решение:
n=123 p n.to_s.split(//).reverse.to_s.to_i
Замечания по решению:
[править] Дано четырехзначное целое число. Необходимо проверить, является ли оно палиндромом.
Возможное решение:
n = 1234 a = n/1000 b = (n/100)%10 c = (n/10)%10 d = n%10 (a == d) && (b == c)
Замечания по решению:
Возможное решение:
x=1234 a=x/1000 b=x/100-a*10 c=x/10-(a*100+b*10) d=x-(a*1000+b*100+c*10) (a==d)&&(b==c)
Замечания по решению:
[править] Дано натуральное число меньшее 256. Необходимо проверить, является ли оно счастливым в двоичном представлении.
Возможное решение:
x=165 ( x[0]+x[1]+x[2]+x[3] ).eql?( x[4]+x[5]+x[6]+x[7] )
Замечания по решению:
Возможное решение:
a[0]+a[1]+a[2]+a[3]==a[4]+a[5]+a[6]+a[7]
Замечания по решению:
Возможное решение:
a=255 a[0]+a[1]+a[2]+a[3] == a[4]+a[5]+a[6]+a[7]
Замечания по решению:
[править] Даны три числа. Необходимо проверить, образуют ли они убывающую последовательность.
Возможное решение:
a=1 b=5 c=10 p (a>b)&&(b>c)
Замечания по решению:
[править] Дано шестизначное целое число. Необходимо проверить, является ли оно палиндромом.
Возможное решение:
d = 324156 a = d/100000 b = d/10000 - a*10 c = d/1000 - (a*100 + b*10) e = d/100 - (a*1000 + b*100 + c*10) f = d/10 - (a*10000 + b*1000 + c*100 + e*10) g = d - (a*100000 + b*10000 + c*1000 + e*100 + f*10) p(d == g*100000 + f*10000 + e*1000 + c*100 + b*10 + a)
Замечания по решению:
[править] Дано целое пятизначное число. Необходимо проверить, является ли оно полиндромом.
Возможное решение:
n = 12345 a = x/10000 b = x/1000%10 c = x%100/10 d = x%100/10 e = x%10 a==e || b==d
Замечания по решению:
[править] Даны три числа. Необходимо проверить, есть ли среди них хотя бы два одинаковых.
Возможное решение:
((a==b)or(b==c)or(c==a))
Замечания по решению:
Возможное решение:
(a==b)||(b==c)||(c==a)
Замечания по решению:
[править] Даны длины катетов прямоугольного треугольника. Необходимо найти длину гипотенузы.
Возможное решение:
a,b = 3,2 Math.sqrt(a**2 + b**2)
Замечания по решению:
[править] Идет k-я секунда суток. Необходимо определить сколько полных часов и полных минут осталось до конца суток.
Возможное решение:
k = 70000 x = 24*3600 t = x-k h = t/3600 m = t%3600/60 p h.to_s + ':' + m.to_s
Замечания по решению:
Возможное решение:
k=5040 b=86400-k p b/3600 c=b%3600 p c/60
Замечания по решению: