Какво трябва да направя, когато „повече от едно копие на претоварена функция sqrt съответства на списъка с аргументи“?

Получавам грешка в моя код в for цикъла, for ( j = 3; j <=sqrt(num); j +=2):

повече от едно копие на претоварена функция "sqrt" съответства на списъка с аргументи.

Как да разреша това?

# include <cmath>

// determine if number is prime
bool isPrime (long n) 
{
  int j, num = 0;
  {
    if (num <=1)
      return false;
  }
  for ( j = 3; j <=sqrt(num); j +=2)
  {
    if (num % j == 0)
      return false;
  }   
  return true;
}

person user1231810    schedule 24.02.2012    source източник
comment
Какви са вашите sqrt() функции? претовари ли го? Какви кандидати ви показва компилаторът?   -  person amit    schedule 25.02.2012
comment
int j, num = 0; { if (num <=1) return false; } Това няма ли да накара isPrime да връща false всеки път?   -  person chris    schedule 25.02.2012
comment
@chris: Наистина. След като това бъде коригирано, следващият цикъл ще върне false за всяко число освен 2.   -  person Mike Seymour    schedule 25.02.2012
comment
@Mike Seymour, Добър улов. Това ще спести малко главоболие по-късно.   -  person chris    schedule 25.02.2012


Отговори (3)


Опитвам:

for (j = 3; j <= std::sqrt(static_cast<float>(num)); j +=2)

Това, което се случва, е, че <cmath> съдържа 3 различни дефиниции на sqrt и компилатора не знае кой се опитвате да използвате.

person mfontanini    schedule 24.02.2012
comment
Освен това трябва да е std::sqrt и вероятно static_cast<float>(num). - person Kerrek SB; 25.02.2012
comment

Имам известие, което съдържа малко текст, но все още е твърде голямо, за да се покаже в лентата за известия, така че е съкратено. Единственото решение, което намерих, е да направя персонализирано известие, но изглежда малко пресилено за това, което се опитвам да направя.

Мога ли да направя текста на известието да се превърта или да разширя текстовата област на известието, така че да показва пълния текст, а не само първите няколко думи от него?

В момента наричам известието с:

private void triggerNotification() {
        Notification notification = new Notification(R.drawable.ic_launcher,
                "Title", System.currentTimeMillis());
        notification.setLatestEventInfo(this, "First text",
                "This is the text that gets abberviated with .. when it is too long",
                PendingIntent.getActivity(this, 0, new Intent(this,MainActivity.class)
                        .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP),
                        PendingIntent.FLAG_CANCEL_CURRENT));
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        nm.notify(0, notification);


}
- person mfontanini; 25.02.2012

Пропуснали сте ъглова скоба в кода си след втората функция Компилираш ли я с -lm таг?

плюс имате нужда от t typecast j като int.

person Community    schedule 24.02.2012

Трябва да напишете разумна sqrt функция. Методът на Нютон вероятно е най-простият начин. Освен това не извиквайте функцията sqrt всеки път в цикъла. Обади се само веднъж.

person David Schwartz    schedule 24.02.2012
comment
Очевидно вече има множество налични sqrt функции. Защо му е на този човек да пише друг? - person Rob Kennedy; 25.02.2012
comment
Никой от тях не прави точно това, което иска. Предполагам, че може да забие кръглото колче в квадратната дупка. Но ние говорим за пет или шест реда код, за да го направим правилно. - person David Schwartz; 25.02.2012
comment
@DavidSchwartz: Всички те правят точно това, което той иска; те просто не са претоварени за точния тип, който той има. Той би могъл да напише пет или шест реда код, плюс няколко десетки, за да го тества, и се надява, че е разбрал всичко правилно, предполагам. Но ние говорим за едно извикване на библиотечна функция, за да го направим правилно. - person Mike Seymour; 25.02.2012
comment
Функция квадратен корен с плаваща запетая прави точно това, което той иска? - person David Schwartz; 25.02.2012