Сторінки

пятница, 16 сентября 2011 г.

Ускладнені завдання ( з запропонованими рішеннями)

№1. Роздрукувати числову послідовність, що задається за наступними правилами: - перше число послідовності - натуральне число, кратне 3 (вхідний параметр завдання);  - кожний наступний елемент дорівнює сумі кубів цифр попереднього.
Наприклад:
33
33+33=54
53+43=189
13+83+93=1242
13+23+43+23=81
83+13=513
53+13+33=153
Обчислення припинити, коли черговий елемент послідовності стане дорівнювати 153. (Відомо, що будь-яка така послідовність рано або пізно приводить до 153).
Рекомендації.
На кожному кроці даного алгоритму доводиться розбивати ціле число на окремі цифри (причому кількість цифр у числі невідомо). Це можна виконати, використовуючи операції цілочисленої арифметики (розподілу націло - div і залишку від розподілу - mod). Процес обчислення чергового члена послідовності p через попередній у розглянутому завданні буде мати такий вигляд (s і p1 - робітники змінні, t - чергова цифра числа):
s:=0; p1:=p;
while p1<>0 do
begin
   t:=p1 mod 10;
   p1:=p1 div 10;
   s:=s+t*t*t;
end;
p:=s;

№ 2. Надрукувати всі натуральні чотиризначні числа, у десятковому записі яких немає однакових цифр, і різниця двох натуральних двозначних чисел, складених із двох послідовних перших цифр і двох послідовних останніх цифр числа, дорівнює сумі всіх цифр числа.
Рекомендації.
Будь-яке ціле чотиризначне число можна представити у вигляді:
(a, b, c, d - цифри числа, причому a 0).
Наприклад: 1742=1*1000+7*100+4*10+2.  Те, що цифри числа не повинні збігатися, можна записати на Паскалі у вигляді умови:
(a<>b)and(a<>c)and(a<>d)and(b<>c)and(b<>d)and(c<>d).
Умова на різницю чисел, складених із цифр числа:
a*10+b-(c*10+d)=a+b+c+d.
Тоді виконувана частина програми буде мати вигляд:
for a:=1 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
for d:=0 to 9 do
if (a<>b)and(a<>c)and(a<>d)and(b<>c)and(b<>d)and(c<>d)and
(a*10+b-(c*10+d)=a+b+c+d)
then writeln(a*1000+b*100+c*10+d);

№3. Показати, що будь-яку суму, більших 7 копійок, можна виплатити, використовуючи тільки 3-х і 5-ти копійчані монети. (Тобто, для будь-якого цілого N>7 знайти такі цілі числа x і y, що 3x+5y=N ).
Рекомендації.
Для розязання цього завдання можна розділити число націло N на 3 і розглянути залишок від розподілу. Існує три варіанти: якщо залишок 0, то сума виплачується трикопієчними монетами; якщо залишок 1 (найменше таке число 10), те необхідно забрати 3 монети по 3 копійки й додати 2 монети по 5 копійок; якщо залишок від розподілу 2, то необхідно забрати 1 трикопієчну монету й додати 1 монету достоїнством 5 копійок. У Паскалі операція розподілу націло - div, операція обчислення залишку при розподілі цілих чисел - mod.
№ 4. Вивести на екран цифри числа 31000. Якщо спробувати одержати число безпосередньо множенням, комп'ютер видасть повідомлення про помилку.
Рекомендації.
Для запису більших чисел зручно використати масиви, записуючи цифри числа як елементи масиву. Оцінимо кількість цифр, необхідних для запису 31000:
32 = 9; 31000 = (32) 500 = 9500 10500.  Таким чином, у записі цього числа буде менш 500 цифр.
Запишемо спочатку в масив тільки число 3 і далі будемо множити його поелементно на 3 потрібне число раз, з огляду на перенос із розряду в розряд, що виникає при множенні.
Програма, що вирішує це завдання, може бути записана, наприклад, так:
const stp=1000;
var i,j,k,prn,x:integer;
    a:array [1..500] of integer;
begin
     a[500]:=3; prn:=0;
     for i:=2 to stp do
     for j:=500 downto 1 do
     begin
          x:=a[j]*3;
          a[j]:=(x+prn) mod 10;
          prn:=(x+prn) div 10;
     end;
     k:=1; while (a[k]=0) do k:=k+1;
     for i:=k to 500 do write(a[i]:1);
     writeln
end.
Тут stp - ступінь, у яку зводиться число 3, a[500] - масив, у якому зберігаються цифри отриманого числа, prn - перенос із розряду в розряд. Обсяг обчислень у даній програмі можна значно скоротити, якщо щораз множити на 3 не весь масив a, тільки його зайняту частину.

Комментариев нет:

Отправить комментарий