Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
AKruglyak
0 / 0 / 0
Регистрация: 18.02.2012
Сообщений: 24
#1

Корень из целого числа. - C++

23.02.2012, 16:14. Просмотров 1953. Ответов 3
Метки нет (Все метки)

Здравствуйте, решал вот эту задачу. Написал следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <math.h>
using namespace std;
int simple(int f);
int main(){
    long int a,f;
    cin>>a;
     int *b = new int [a];
     for(int i=0; i<a; i++)
     cin>>b[i];        
            
     for(int k=0; k<a; k++){
             f=0;
             f=b[k];
             if(f==1)
             cout<<"2\n";
             else if(f!=1)
             simple(f);
             
             } 
  
    }
    
 int simple(int f){
     long int b=1;
    int c=0;
    
  for(unsigned long int i=3; i<15000; i+=2){
         c=0;
         for(unsigned long  int k=2; k<=sqrt(i); k++){
                   if (i%k==0)
                   c++;      
                   }
                   if(!c)
                          b++;
                  if(f==b){
                          cout<<i<<"\n";
                          break;
                          return 0;}
          
       }
     
     }
И в Dev c++ всё прекрасно работает. Но тестирующая система выдает следующею ошибку:
2394d50f-45a1-4d8b-96c1-91540d2a1d30
2394d50f-45a1-4d8b-96c1-91540d2a1d30(30) : error C2668: 'sqrt' : ambiguous call to overloaded function
S:\checker\compile\vc10\include\math.h(589): could be 'long double sqrt(long double)'
S:\checker\compile\vc10\include\math.h(541): or 'float sqrt(float)'
S:\checker\compile\vc10\include\math.h(127): or 'double sqrt(double)'
while trying to match the argument list '(unsigned long)'
Как я понял причина в том, что корень берется из целого числа, а должен браться из числа с плавающей запятой. Не долго думаю я заменил unsigned long int на float, чего делать не рекомендуется, и тут же получил другую ошибку, что вполне логично:
8ac29b8a-d7f7-4e4c-9a4d-9560ca0434bc
8ac29b8a-d7f7-4e4c-9a4d-9560ca0434bc(31) : error C2296: '%' : illegal, left operand has type 'float'
И так, как исправить мой код, чтобы он работал в тестирующей системе?

Добавлено через 8 минут
Еще я пробовал изменить функцию simple следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 int simple(int f){
     long int b=1;
    int c=0;
    
  for(unsigned long int i=3; i<15000; i+=2){
         c=0;
         for(unsigned long  int k=1; k<=i; k++){
                   if (i%k==0)
                   c++;      
                   }
                   if(c==2)
                          b++;
                  if(f==b){
                          cout<<i<<"\n";
                          break;
                          return 0;}
          //         cout<<i<<' ';
       }
     
     }
И на моем компьютера программа исполняется мгновенно, но в тестирующей системе получаю Time limit exceeded, так как программа выполняется на одну сотую дольше, чем надо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2012, 16:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Корень из целого числа. (C++):

Выделить кубический корень из не целого числа - C++
Ребят, нужна ваша помощь! Как выделить кубический корень из НЕ целого числа? P.S. pow(r,1/3) не работает.

Можно ли взять корень квадратный из целого числа без остатка? - C++
Как унать, возможно ли вынести корень из числа а?

Составить рекурсивную функцию, которая находит цифровой корень целого числа - C++
Составить рекурсивную функцию, которая находит цифровой корень целого числа. Цифровой корень находится суммой через сумму цифр числа до...

Составить рекурсивную функцию, которая находит цифровой корень целого числа - C++
помогите решить задачу на С++ Составить рекурсивную функцию, которая находит цифровой корень целого числа. Цифровой корень находится...

Вычислить квадратный корень из заданного целого числа, используя только побитовые операции - C++
Существует простой способ вычисления квадратного корня: квадратный корень из целого числа равен количеству последовательных целых чисел...

Описать функцию DigitN(K, N) целого типа, возвращающую N-ю цифру целого положительного числа K - C++
Помогите выполнить задание. Описать функцию DigitN(K, N) целого типа, возвращающую N-ю цифру целого положительного числа K (цифры в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
23.02.2012, 16:21 #2
C++
1
2
int n = 5;
float a = sqrt (float(n));
0
AKruglyak
0 / 0 / 0
Регистрация: 18.02.2012
Сообщений: 24
23.02.2012, 17:56  [ТС] #3
Спасибо, оказалось этого не достаточно. В погоне за производительностью было решено найти максимальное число из предложенных, один раз посчитать все простые числа до него и записать их в массиве, откуда уже читать остальные. Получилось вот что:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <math.h>
using namespace std;
 
int main(){
      long int a,f, ok;
    cin>>a;
     int *b = new int [a];
     for(int i=0; i<a; i++)
     cin>>b[i];        
      int maximum=0;
         for(int g=0;g<=a; g++)
         {if (b[g]>maximum) 
         maximum=b[g];
               }   
                    long int bj=1;
     long int cj=0;
     long int p[maximum];
  for( long int i=3; i<=maximum; i+=2){
         cj=0;
         for( long int k=2; k<=i/2; k++){
                   if (i%k==0)
                   cj++;      
                   }
                   if(!cj){
                          bj++;
                      p[bj]=i;
                      }    
                 
     }
               
    
     for(int k=0; k<a; k++){
             f=0;
             ok=0;
             f=b[k];
             if(f==1)
             cout<<"2\n";
            else if(f!=1){
           ok=p[f];
             cout<<ok<<"\n";}
             }
     system("PAUSE");
    }
Теперь программа работает вообще странно, считать она считает, но далеко не все числа, и не могу найти закономерность тех чисел, которые считать она отказалась, а их много. В чем ошибка?
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
23.02.2012, 18:39 #4
1) Вы проверяете число от 2 до n/2. Если уже так, то проверять до корня.
2) Лучше всего проверять на простоту решетом Эратосфена. Представим, что все числа записаны в ряд:
2 3 4 5 6 7 8 9 10 11 12 13 14 15

2 - число простое, оставляем его и убираем все числа, которые делятся на 2, т.к. они будут составными

2 3 5 7 9 11 13 15

3 - число простое, удаляем все числа делящиеся на 3
2 3 5 7 11 13

Вот вам и остались все простые числа в интервале [1; 15]
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2012, 18:39
Привет! Вот еще темы с ответами:

Даны два числа. Если квадратный корень из второго числа меньше первого числа, то увличить второе число в пять раз с++ - C++
Даны два числа. Если квадратный корень из второго числа меньше первого числа, то увличить второе число в пять раз с++ Добавлено через...

Вставить после числа, являющегося полным квадратом, квадратный корень этого числа - C++
Вставить после числа, являющегося полным квадратом, квадратный корень этого числа. Вообще не понимаю как это написать в Си( ...

Определить цифры целого числа (тип числа - целое без знака) - C++
Определить цифры целого числа( тип числа-целое без знака), вычислить сумму полученных цифр. Помогите ,пожалуйста.

Конструирование значения целого числа или числа с плавающей точкой по его дампу - C++
Как сконструировать значения целого числа(char, short int, long int) или числа с плавающей точкой(float,double) по его дампу(bin,oct,hex)??


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.02.2012, 18:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru