Avatar billede trp79 Nybegynder
13. januar 2003 - 23:21 Der er 17 kommentarer og
4 løsninger

Tjekke på om værdi er heltal

Findes der en metode til at tjekke på om et tal er et heltal. Jeg vil prøve at lave et program som finder primtal. Bør jeg i den situation bruge float eller double, tjekke på om det et heltal, eller hvordan bør man strikke det sammen?

Hvis omtalte metode findes, hvordan fungerer den så (kodemæssigt?)
Avatar billede articfruit Nybegynder
13. januar 2003 - 23:30 #1
Avatar billede laplands-ugle Nybegynder
13. januar 2003 - 23:33 #2
Hvis du vil lave et program som finder primtal, er det nemmeste da at bruge int værdier. Istedet for at bruge float og double og så skulle tjekke om det er heltal :)
Avatar billede trp79 Nybegynder
13. januar 2003 - 23:37 #3
Jep det er jeg godt klar over. Men skal man fx tjekke på om 5 er et primtal kan man fx: 5/2, 5/3 og 5/4. Hvis man her bruger int, vil der jo automatisk blive afrundet. Derfor er jeg nød til at tjekke på om det er et heltal og fx bruge float a=5/4
Avatar billede trp79 Nybegynder
13. januar 2003 - 23:38 #4
Hvad bruger man % tegnet til i java? fx if ( kandidat % divisor == 0 )
Avatar billede articfruit Nybegynder
13. januar 2003 - 23:40 #5
kan du ikke bruge modolud i stedet så? hvis tal%x = 0 er det ikke en primtal (forenklet eksempel)
Avatar billede articfruit Nybegynder
13. januar 2003 - 23:42 #6
modolus even. Det er resten du får fra heltalsdivision
Avatar billede articfruit Nybegynder
13. januar 2003 - 23:44 #7
Avatar billede articfruit Nybegynder
13. januar 2003 - 23:44 #8
www.docjava.dk du kan finde meget godt her...
Avatar billede laplands-ugle Nybegynder
14. januar 2003 - 00:35 #9
boolean isPrime(int tal)
{
  boolean prime = true;
  for(int i=2;i<tal;i++)
  {
      if(tal%i==0)
        prime = false;
  }
}

Sådan der kunne en simpel metode til at tjekke om et tal er primtal se ud. Der findes algoritmer som beregner det smartere, men overstående burde virke.
Avatar billede viht Nybegynder
14. januar 2003 - 00:35 #10
Et primtal skal være et helt tal, ellers er det ikke et primtal!
Hvis du vil konvertere et floating point tal til et heltal er det nemmest bare at caste det til en long eller en int.
double tal = 1.125;
int heltal = (int)tal; // 1

public boolean isPrime(long tal) {
  long root = Math.sqrt(tal);
  for(long i = 2; i <= root ; i++) {
      if (tal % i == 0)
        return false;
  }
  return true;
}
Avatar billede viht Nybegynder
14. januar 2003 - 00:39 #11
lige en typo..
bør være:
double root = Math.sqrt(tal);
Avatar billede viht Nybegynder
14. januar 2003 - 00:39 #12
public class Test {
   
    public static void main(String[] args) {
       
    //    double tal = 1.125;
    //    System.out.println ((int)tal);
        for( long i = 0; i < 1000; i++ ) {
            if( isPrime(i))
                System.out.println (i);
        }
       
    }
    public static boolean isPrime(long tal) {
          double root = Math.sqrt(tal);
          for(long i = 2; i <= root ; i++) {
          if (tal % i == 0)
                return false;
          }
          return true;
    }
   
}
Avatar billede laplands-ugle Nybegynder
14. januar 2003 - 01:01 #13
haha.. orv det var sent hva.. hmm tror jeg kravler under dynen, min ville nok virke bedre hvis den ligefrem returnerede noget ;)

boolean isPrime(int tal)
{
  boolean prime = true;
  for(int i=2;i<tal;i++)
  {
      if(tal%i==0)
        prime false;
  }
  return prime;
}
Avatar billede viht Nybegynder
14. januar 2003 - 01:03 #14
Der er ingen grund til at checke på tal større end kvadratroden af tallet selv.
Avatar billede laplands-ugle Nybegynder
14. januar 2003 - 01:07 #15
fuldstændig rigtig :)
Avatar billede arne_v Ekspert
14. januar 2003 - 02:17 #16
Hvis du kun skal teste om et tal er et primtal, så er viht's
isPrime udmærket.

Men hvis du skal finde alle primtal 2..N, så kan det gøres
bedre end bare kalde isPrime for all tal.

Kør følgende program for at se det:

public class Prime {
    public static void main(String[] args) {
        for(int i = 10; i <= 10000000; i *= 10) {
          prime1(i);
          prime2(i);
        }
    }
    public static void prime1(int n) {
        long t1 = System.currentTimeMillis();
        int count = 0;
        for(int i = 2; i <= n; i++) {
            int maxj = (int) Math.sqrt(i);
            boolean fnd = false;
            for(int j = 2; j <= maxj; j++) {
                if((i % j) == 0) {
                    fnd = true;
                    break;
                }
            }
            if(!fnd) count++;
        }
        long t2 = System.currentTimeMillis();
        System.out.println(count + " of " + n + " by division: " + (t2 - t1));
        return;
    }
   
    public static void prime2(int n) {
        long t1 = System.currentTimeMillis();
        boolean[] pri = new boolean[n+1];
        for(int j = 0; j <= n; j++) pri[j] = true;       
        pri[2] = true;
        for(int i = 2; i <= n; i++) {
            if(pri[i]) {
                for(int j = 2 * i; j <= n; j += i) {
                    pri[j] = false;
                }
            }
        }
        int count = 0;
        for(int j = 2; j <= n; j++) if(pri[j]) count++;
        long t2 = System.currentTimeMillis();
        System.out.println(count + " of " + n + " by flagging: " + (t2 - t1));
        return;
    }
}
Avatar billede arne_v Ekspert
14. januar 2003 - 02:27 #17
Med hensyn til det original spørgsmål "Findes der en metode til at tjekke på om et tal er et heltal" så kan det ikke gøres eksakt.

Man må teste om et tal ligger EPS tæt på et heltal.

Noget i retning af:

public class Special {
    private final static double EPS = 0.000001;
    public static void main(String[] args) {
        test(0.9);
        test(0.99);
        test(0.999);
        test(0.9999);
        test(0.99999);
        test(0.999999);
        test(0.9999999);
        test(0.99999999);
        test(1.1);
        test(1.01);
        test(1.001);
        test(1.0001);
        test(1.00001);
        test(1.000001);
        test(1.0000001);
        test(1.00000001);
    }
    private static void test(double x) {
        System.out.println(x + " " + isReallyInt(x));
        return;
    }
    private static boolean isReallyInt(double x) {
        long near = (int)(x + 0.5);
        if(((x - near) < -EPS) || ((x - near) > EPS))
            return false;
        else
            return true;
    }
}
Avatar billede viht Nybegynder
14. januar 2003 - 02:44 #18
Jeg var ikke bekendt med den nederste metode.. den viser sig at være rimelig giftig ved høje talmængder. Den vil jeg gemme :)
Avatar billede trp79 Nybegynder
14. januar 2003 - 07:19 #19
Skønt med alle svarene, jeg takker! :o)
Avatar billede arne_v Ekspert
14. januar 2003 - 09:56 #20
viht>

Den hedder "Sieve of Eratosthenes" og er kune 2200 år gammel !
Avatar billede viht Nybegynder
14. januar 2003 - 11:10 #21
Så er det jo også på tide jeg får den lært :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester