Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите переделать С++ в СИ, пожалуйста 
V
    Опции темы
Splendid
Дата 18.8.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Нужно переделать этот код в Си, помогите, пожалуйста...

Код


#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <vector>

template <class T, class T2>
const std::vector<T> & get_primes (const T & b, T2 & pi)
{

    static std::vector<T> primes;
    static T counted_b;

    
    if (counted_b >= b)
        pi = T2 (std::upper_bound (primes.begin(), primes.end(), b) - primes.begin());
    else
    {
    

        if (counted_b == 0)
        {
            primes.push_back (2);
            counted_b = 2;
        }

       
        T first = counted_b == 2 ? 3 : primes.back()+2;
        for (T cur=first; cur<=b; ++++cur)
        {
            bool cur_is_prime = true;
            for (std::vector<T>::const_iterator iter = primes.begin(), end = primes.end();
                iter != end; ++iter)
            {
                const T & div = *iter;
                if (div * div > cur)
                    break;
                if (cur % div == 0)
                {
                    cur_is_prime = false;
                    break;
                }
            }
            if (cur_is_prime)
                primes.push_back (cur);
        }
        
        counted_b = b;
        pi = (T2) primes.size();

    }
    
    return primes;

}


template <class T, class T2>
T2 prime_div_trivial (const T & n, T2 m)
{
    
   
    if (n == 2 || n == 3)
        return 1;
    if (n < 2)
        return 0;
    if (even (n))
        return 2;


    T2 pi;
    const vector<T2> & primes = get_primes (m, pi);
 
    for (std::vector<T2>::const_iterator iter=primes.begin(), end=primes.end();
        iter!=end && *iter <= m; ++iter)
    {
        const T2 & div = *iter;
        if (div * div > n)
            break;
        else
            if (n % div == 0)
                return div;
    }
    
    if (n < m*m)
        return 1;
    return 0;

}


PM MAIL   Вверх
W4FhLF
Дата 18.8.2008, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Для этого кода невозможно получить полноценный аналог на С, т.к. в нём нет шаблонов и понятия обобщённого программирования (вариант с кучей макросов не рассматриваю). 

В коде активно используются контейнеры, алгоритмы и итераторы STL. Их можно заменить реализовав всё вручную. 

Поэтому я очень сомневаюсь, что здесь кто-то будет переделывать за тебя всё это. Задавай более конкретные вопросы. 




--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Splendid
Дата 20.8.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



вот более конкретный вопрос:

Как полученные этим кодом:

Код


#include <stdio.h>
#define N 256
//алгоритм "решето Эвклида"

int main(){

    unsigned int a[256];
    int i, s, j;
   //заполним все ячейки числами по порядку: 0,1,2,3...
   for( i=0; i<N; i++){
       a[i] = i;
   }
   //поскольку 1 не простое число, обнулим ячейку с этим числом
   a[1]=0;
   
   for (s=2; s<N; s++){
       if(a[s]!=0){
       for(j=s*2; j<N; j+=s){
           a[j]=0;
       }
       }
   }
   for(i=0; i<N; i++){
       if(a[i]!=0){
       printf("%d\n", a[i]);
       }
   }

}


простые числа - т.е. последовательость a[i], передать в цикл....

Пробую так дописать - фигня получается:

Код

Код:

   for(i=0; i<N; i++){
       if(a[i]!=0 && n % a[i]==0){
       return 0;
       }
       return 1;
   }
  
       
}

main() 

{
      int n=0;
        printf( "Enter any number -> \n");
        scanf("%u", &n);
        printf("%s\n",
            (
                delimost (n) ?
                "It is possibly a prime number" :
                "It is composite number"
            )
        );
    return 0;

}



а нужно, чтобы цикл брал все ненулевые a[i] (т.е. все простые числа) по порядку и делил n на каждое из них, и если все остатки не равны нулю - то выводил бы - It is possibly a prime number
PM MAIL   Вверх
NoliX
Дата 20.8.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: 1
Всего: 1



Я так понимаю, что требуется проверить, является ли число простым
В данном случае написан код - решето Эратосфена для первых 256 чисел

Если требуется проверить, является ли число, N<256 простым то достаточно ввести проверку

Код

if (a[N] == 0) 
   printf ("It is possibly a prime number");


Потому что по алгоритму мы вычеркивали все составные числа из нашего массива

Если требуется проверить, является ли число, 256<N<66049 (это 257*257) простым то придется действительно делить но все простые числа меньше 256
для нужно исправить

Код

for(i=0; i<N; i++){
       if(a[i]!=0 && n % a[i]==0){
       return 0;
       }
       return 1;
   }


на

Код

for (i=0; ((i<(n/2 + 1)) && (i<N)); i++){
       if((a[i]!=0) && (n % a[i]==0)){
       return 0;
       }
   }
return 1;


хотя вместо i<(n/2) правильно писать i<sqrt(n) (квадратный корень)


И вообще такой алгоритм проверки крайне тредоемок на подготовительном уровне, это целесообразно делать, если нужно проверить миилионы чисел. а ради одного числа составлять решено не хорошо, плюс массив не динамический. памяти жрет ненужное количество

логичнее в этом случае я думаю сделать так

Код

#include "stdafx.h"

bool isPrime (unsigned int n){
    for (unsigned int i=2; i<(n/2+1);i++){
        if (n % i == 0) 
            return false;
    }
    return true;
}

int _tmain(int argc, _TCHAR* argv[]){
    unsigned int n=0;
    printf( "Enter any number -> \n");
    scanf("%u", &n);

    if (isPrime(n)) 
        printf("It is possibly a prime number\n");
    else
        printf("It is composite number\n");

    return 0;
}



Это сообщение отредактировал(а) NoliX - 20.8.2008, 14:04
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Splendid
Дата 20.8.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



в алгоритме нужно заданное число методом тривиального деления проверить на простоту, для этого решетом Эратосфена вычисляются все простые числа до 256 - я так понимаю, что это оптимальная проверка, отсекает все четные и 80% нечетных составных чисел, а потом заданное число поделить на все эти полученные простые....я переписала этот цикл так:

Код

 for(i=0; i<N; i++){

        if(a[i]!=0 && a[i]!=n && n % a[i]==0)
        
        {
            //printf("%d\n", a[i]);
            return 0;
        }


вроде работает....это правильно?
PM MAIL   Вверх
NoliX
Дата 20.8.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: 1
Всего: 1



Вы меня не читаете (слушаете)

я уже написал, что нужно написать вот так:
Код

for (i=0; ((i<(n/2 + 1)) && (i<N)); i++){
       if((a[i]!=0) && (n % a[i]==0)){
       return 0;
       }
   }
return 1;


В Вашем коде Вам, может быть, придется делить на заведомо большие проверяемого числа числа, например не нужно делить 5 на 33, и так понятно, что 5 больше чем на 3 не поделится (а это 5/2+1)

А по поводу, что не гарантирует правильности результата - это я конечно чушь спорол, ошибка будет только после 66049

Это сообщение отредактировал(а) NoliX - 20.8.2008, 14:03
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Splendid
Дата 20.8.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



NoliX, спасибо! Я все поняла!!! Тему можно закрытьsmile
PM MAIL   Вверх
virtul
Дата 2.9.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 28.4.2008

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0827 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.