IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Помогите, пожалуйста, с задачами по C!, 2 задачи на языке C: числа палиндромы, последовательность Хемминга.
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Дмитрий Кожевников

Репутация: -  0  +


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

Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

Репутация: -  3  +


Цитата(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.

В С не разбираюсь, но думаю тебе и тут будет понятно.

Сообщение отредактировано: DarkWishmaster -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> std::cout << "Hamming(" << index << ") = " << i << std::endl;

Где здесь C?

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

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

while (0 == n % divs[i])


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
Где здесь C?
Я нигде решения "копируй и сдавай" не обещал. Я даю рабочее решение, но чтобы его сдать - надо хоть что-то сделать самостоятельно.

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


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Если кто-то не знает, что (!n) и (n == 0) это одно и то же - это ни разу не мои проблемы.

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 9.05.2024 9:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name