Форум: Форум C++Разное
Новые темы: 00
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: C++ массивы
 
 автор: dimaangel   (15.12.2008 в 14:39)   письмо автору
 
 

Всем првие, помогите пожалуста решить задачу.
"Дан целочисленный массив А[N]. Заменить все элементы массива, являющиеся простыми числами, на максимальное значение элементов массива."
спасиба

  Ответить  
 
 автор: GeorgeIV   (15.12.2008 в 17:02)   письмо автору
 
   для: dimaangel   (15.12.2008 в 14:39)
 

Так, сходу без изысков

#include <stdio.h>
#include <iostream>

int A[10] = {3,5,45,34,18,11,7,56,78,89};
int is_simple(const int number)
{
for (int i=2; i< number; ++i)
if ((number % i) == 0)
return 0;
return 1;
}
int get_max(int A[10])
{
int start = A[0];
for (int i=1; i<10; ++i)
{
if (A[i] > start) start = A[i];
}
return start;
}
int main(int argc, char* argv[])
{
int max = get_max(A);
for (int i=0; i <10; ++i)
{
if (is_simple(A[i]))
{
    std::cout << A[i];
std::cout << "-simple ";
std::cout << max;
std::cout << "-max \r\n";
}
else
{
    std::cout << A[i];
std::cout << "-nosimple \r\n";
}
    
}
system("Pause");
return 0;
}

  Ответить  
 
 автор: dimaangel   (15.12.2008 в 17:09)   письмо автору
 
   для: GeorgeIV   (15.12.2008 в 17:02)
 

Спасибо канешно, но можно как нить проще написать для первого курса?)

  Ответить  
 
 автор: bronenos   (15.12.2008 в 17:32)   письмо автору
 
   для: dimaangel   (15.12.2008 в 17:09)
 

Можно сделать чуть иначе, но весь смысл на 99% остается тот же..

#include <stdio.h>
#include <iostream>

int A[10] = { 3, 5, 45, 34, 18, 11, 7, 56, 78, 89 };

bool is_simple(int number)
{
  for (int i=3; i<number; i++)
  {
    if ((number % i) == 0) return false;
  }

  return true;
}

int get_max(int a*)
{
  int start = 0;
  for (int i=0; i<10; i++)
  {
    if (a[i] > start) start = a[i];
  }

  return start;
}

int main(int argc, char* argv[])
{
  int max = get_max(A);
  for (int i=0; i <10; i++)
  {
    if (is_simple(A[i]))
      std::cout << A[i] << "-simple " << max << "-max \r\n";
    else
      std::cout << A[i] << "-nosimple \r\n";

    system("Pause");
    return 0;
}


P.S. В цикле ++i было несовсем прально

  Ответить  
 
 автор: dimaangel   (15.12.2008 в 17:49)   письмо автору
 
   для: bronenos   (15.12.2008 в 17:32)
 

мы это еще не проходили, надо попроще

  Ответить  
 
 автор: GeorgeIV   (15.12.2008 в 18:09)   письмо автору
 
   для: dimaangel   (15.12.2008 в 17:49)
 

А проще уже некуда, дальше только калькулятор...

  Ответить  
 
 автор: exp   (15.12.2008 в 23:18)   письмо автору
 
   для: dimaangel   (15.12.2008 в 17:49)
 

может быть такими функциями надо ?

#include<stdio.h> // для printf();
#include<conio.h> //для необязательных getch(), putch() 
// для sizeof() не помню  и надо-ли чего-нибудь :)

int main() {
 
int A[10] = {3,5,45,34,18,11,7,56,78,89};
// массив
int i=0, max=A[0]; // максимум и счётчик

const int count = sizeof(A) / sizeof(int); 
// и не знаю как обычно узнают размер массива
printf(" ---\nв массиве %i елементов\n\n", count);

while ((i+=1) < count) { // поиск

   if (A[i] > max) max= A[i];
   printf("max = %i\n", max);
}
printf(" ---\n\nмаксимальное значение %i\n", max);

i=0;
while (i < count) { // заполнение и распечатка

   A[i] = max;
   printf("A[%i] = %i\n", i, A[i]);
   i++;
}
getch(); // задержка и выход
putch(7);
return 0;
}

  Ответить  
 
 автор: GeorgeIV   (15.12.2008 в 18:33)   письмо автору
 
   для: bronenos   (15.12.2008 в 17:32)
 

P.S. В цикле ++i было несовсем прально

Почему?

  Ответить  
 
 автор: bronenos   (16.12.2008 в 01:19)   письмо автору
 
   для: GeorgeIV   (15.12.2008 в 18:33)
 

Потому что ++i сначала делает инкремент, а потом возвращает значение, поэтому у Вас какой-то индекс, считайте, не отрабатывался, в итоге не весь массив проходил проверку..

  Ответить  
 
 автор: GeorgeIV   (16.12.2008 в 12:35)   письмо автору
 
   для: bronenos   (16.12.2008 в 01:19)
 

Вы что то путаете. Прочитайте внимательно разницу между ++i и i++. Никакой из индексов не пропускался, если бы вы запустили мой пример. ++i выполняется в КОНЦЕ каждого цикла, а разница в том, что при ++i не создается промежуточной переменной, в отличие от i++.

  Ответить  
 
 автор: bronenos   (16.12.2008 в 18:03)   письмо автору
 
   для: GeorgeIV   (16.12.2008 в 12:35)
 

Ой, пардон, в пол-2 ночи я уже перестал обращать внимания на то, что это третий раздел for =)

  Ответить  
 
 автор: GeorgeIV   (17.12.2008 в 09:19)   письмо автору
 
   для: bronenos   (16.12.2008 в 18:03)
 

Верю, бывает... :-)
Чем ближе к 5 утра, тем чаще

  Ответить  
 
 автор: exp   (16.12.2008 в 03:32)   письмо автору
 
   для: GeorgeIV   (15.12.2008 в 18:33)
 

попробовал убавить лишних проверок в цикле
но как-то сомнительно :)

// заполнение и распечатка
i=0;
int u=3; //

while (i < count) {

u=3;
if ((A[i] &~ A[i]-1) == A[i]) { // числа мерсена
 
 while (u<A[i]/* && A[i]<max*/ ) {    
  if ((A[i] % u) == 0) {
      A[i] = max;
    break;
   }
 u++;
  }
}
  else A[i] = max; // не мерсена

  printf("A[%i] = %i\n", i, A[i]);
i++; 
}

где-то видел замеряли время работы программ , но не понял чем это делали.

  Ответить  
 
 автор: exp   (16.12.2008 в 12:08)   письмо автору
 
   для: exp   (16.12.2008 в 03:32)
 

Это был похоже неправильный вариант

конечный вариант вроде такой ,) если простые числа были 3 5 7 11 45
while (i < count) {
if ((A[i] &~ A[i]-1) == 0) A[i] = max;
i++; 
}


// upd:
только-что понял, что 45 не простое число т.к. делится на 5 :)


// ++upd:

разобрался каким боком здесь числа мерсена :)
int i=0,m=1,u=1; //

for (i=1; i< 112; i++) {
    char* just ="just";
  for (u=1, m=2; m<i; m=(u<<1)+1, u = m) {
 
  if ((i % m) == 0) {
      just ="NO";
    break;
   }
  }
  printf(" %i %s\n", i, just);
}

  Ответить  
 
 автор: bronenos   (16.12.2008 в 19:03)   письмо автору
 
   для: exp   (16.12.2008 в 12:08)
 

Ну да.. побитовый сдвиг.. как раз для первокурсника ))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования