Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите, пожалуйста, с задачами по C!
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Diman
Здравствуйте.
Помогите, пожалуйста, с решением второй и четвёртой задачи на C. Можно просто словесный алгоритм решения.
Заранее, спасибо!
smile.gif

Нажмите для просмотра прикрепленного файла
DarkWishmaster
Цитата(Diman @ 30.03.2011 16:41) *

Здравствуйте.
Помогите, пожалуйста, с решением второй и четвёртой задачи на C. Можно просто словесный алгоритм решения.
Заранее, спасибо!
smile.gif

Нажмите для просмотра прикрепленного файла

) По второй задаче делаем цикл от 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.

В С не разбираюсь, но думаю тебе и тут будет понятно.
volvo
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.
TarasBer
> std::cout << "Hamming(" << index << ") = " << i << std::endl;

Где здесь C?

> while(!(n % divs[i])) // Пока остаток от деления = 0

Может, тут лучше прямо написать?

while (0 == n % divs[i])
-Volvo-
Цитата
Где здесь C?
Я нигде решения "копируй и сдавай" не обещал. Я даю рабочее решение, но чтобы его сдать - надо хоть что-то сделать самостоятельно.

Цитата
Может, тут лучше прямо написать?
while (0 == n % divs[i])
Вот когда ты будешь писать код - там будешь решать, что лучше, а что - хуже. Я делаю так, как привык делать. Если кто-то не знает, что (!n) и (n == 0) это одно и то же - это ни разу не мои проблемы.
TarasBer
> Если кто-то не знает, что (!n) и (n == 0) это одно и то же - это ни разу не мои проблемы.

Ну конечно, все сразу автоматом так и прочитывают, не напрягаясь. А комментарий в этом месте ты просто так написал.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.