|
|
|
| Всем првие, помогите пожалуста решить задачу.
"Дан целочисленный массив А[N]. Заменить все элементы массива, являющиеся простыми числами, на максимальное значение элементов массива."
спасиба | |
|
|
|
|
|
|
|
для: 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;
}
|
| |
|
|
|
|
|
|
|
для: GeorgeIV
(15.12.2008 в 17:02)
| | Спасибо канешно, но можно как нить проще написать для первого курса?) | |
|
|
|
|
|
|
|
для: 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 было несовсем прально | |
|
|
|
|
|
|
|
для: bronenos
(15.12.2008 в 17:32)
| | мы это еще не проходили, надо попроще | |
|
|
|
|
|
|
|
для: dimaangel
(15.12.2008 в 17:49)
| | А проще уже некуда, дальше только калькулятор... | |
|
|
|
|
|
|
|
для: 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;
} |
| |
|
|
|
|
|
|
|
для: bronenos
(15.12.2008 в 17:32)
| | P.S. В цикле ++i было несовсем прально |
Почему? | |
|
|
|
|
|
|
|
для: GeorgeIV
(15.12.2008 в 18:33)
| | Потому что ++i сначала делает инкремент, а потом возвращает значение, поэтому у Вас какой-то индекс, считайте, не отрабатывался, в итоге не весь массив проходил проверку.. | |
|
|
|
|
|
|
|
для: bronenos
(16.12.2008 в 01:19)
| | Вы что то путаете. Прочитайте внимательно разницу между ++i и i++. Никакой из индексов не пропускался, если бы вы запустили мой пример. ++i выполняется в КОНЦЕ каждого цикла, а разница в том, что при ++i не создается промежуточной переменной, в отличие от i++. | |
|
|
|
|
|
|
|
для: GeorgeIV
(16.12.2008 в 12:35)
| | Ой, пардон, в пол-2 ночи я уже перестал обращать внимания на то, что это третий раздел for =) | |
|
|
|
|
|
|
|
для: bronenos
(16.12.2008 в 18:03)
| | Верю, бывает... :-)
Чем ближе к 5 утра, тем чаще | |
|
|
|
|
|
|
|
для: 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 в 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);
} |
| |
|
|
|
|
|
|
|
для: exp
(16.12.2008 в 12:08)
| | Ну да.. побитовый сдвиг.. как раз для первокурсника )) | |
|
|
|