1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Здравствуйте. Помогите, пожалуйста, с решением второй и четвёртой задачи на C. Можно просто словесный алгоритм решения. Заранее, спасибо!
) По второй задаче делаем цикл от 1 до N: for i:=1 to n do если i палиндром тогда если i^3 палиндром, то выводи на экран i. для функции полиндрома можно поставить все цифры числа в векторе, пройти пол вектора и посмотреть если a[i]=a[n-i+1] если да, то значит он палиндром. Вот для четвертой задачи:
uses crt; function Prost(n:longint):boolean;{определение простого числа} var i:longint; begin Prost:=true; for i:=2 to round(sqrt(n))do{от двух до корня из числа} if n mod i=0 then{если на что-то делится} begin Prost:=false;{не простое} break;{дальше не проверяем} end; end; function Hemming(n:longint):boolean;{определение Хемминга} var i:longint; begin Hemming:=true; for i:=7 to n div 2 do{от 7(меньше допустимо)до середины числа} if Prost(i)and not(i in [2,3,5]) and(n mod i=0) then{если простое и на него можно делить} begin Hemming:=false;{не Хемминг} break;{дальше не ищем} end; end; var n,a,k:integer; begin clrscr; write('n=');readln(n); a:=1;k:=1; while k<=n do begin inc(a); {если число делится на 2,3,5 и больше ни на одно простое} if ((a mod 2=0)or(a mod 3=0)or(a mod 5=0)) and Hemming(a) then begin inc(k);{считаем} write(a,' ');{это просто для проверки, можно убрать} end; end; writeln; write('Hemming(',n,')=',a); readln end.
В С не разбираюсь, но думаю тебе и тут будет понятно.
DarkWishmaster, усложняешь решение. Все проще гораздо.
Во-первых, никто не просил печатать все числа Хэмминга. Достаточно напечатать одно: то самое, которое первое после заданного пользователем числа. А для того, чтобы определить, принадлежит ли число к последовательности Хэмминга, совсем не нужно определять его простоту. Достаточно его поочередно целочисленно делить на 2, 3, 5 до тех пор пока либо в частном не получим 1 (следовательно, число других делителей кроме 2, 3, 5 не имеет), либо пока остаток будет ненулевым. К примеру, берем 10. сначала делим на 2. =5 (0 в остатке). Еще раз на 2? Нет, нельзя, в остатке будет 1. На 3? Нет, в остатке будет 2. На 5? Да, =1 (0 в остатке). Добрались до 1 в частном, число является 5-гладким (это еще одно название такой последовательности. Подробнее здесь)
Итого, программа выглядит так:
#include <iostream>
bool is_hemming(int n) { int divs[3] = {2, 3, 5};
for(int i = 0; n != 1 && i < 3; i++) // цикл закончится когда i = 3, или n = 1 { while(!(n % divs[i])) // Пока остаток от деления = 0 { n = n / divs[i]; } } return (n == 1); // если частное = 1, значит нашли "5-гладкое" число... } int main() {
int i, n, index = 0; std::cin >> n; for(i = 2; ; i++) { if(is_hemming(i)) { index += 1; if (i > n) break; } } std::cout << "Hamming(" << index << ") = " << i << std::endl; return 0; }
Вводим 1025 - программа справедливо показывает, что следующее число Хэмминга = 1080.
Я нигде решения "копируй и сдавай" не обещал. Я даю рабочее решение, но чтобы его сдать - надо хоть что-то сделать самостоятельно.
Цитата
Может, тут лучше прямо написать? while (0 == n % divs[i])
Вот когда ты будешь писать код - там будешь решать, что лучше, а что - хуже. Я делаю так, как привык делать. Если кто-то не знает, что (!n) и (n == 0) это одно и то же - это ни разу не мои проблемы.