2015-02-18 37 views
7

İki sayı bir ödev için nispeten birincil olup olmadığını hesaplayacak bir yöntem yazmaya çalışıyorum. Öncelikle nereden başlayacağımıza dair cevaplar arıyorum. Bildiğim kadarıyla benim için çok şey yapacak olan gcd() bir yöntem var, ama ödev hemen hemen bana gcd veya diziler olmadan yapmamı sağlıyor.İki sayı nispeten birincil olup olmadığını bulma

Başladım, çünkü bir döngü içinde % işlecini kullanmam gerektiğini biliyorum.

public static boolean relativeNumber(int input4, int input5){ 
    for(int i = 1; i <= input4; i++) 

Açıkçası bu yöntem yalnızca main işlevi yalnızca iki sayı aralarında asal olup olmadıklarını bağlı olarak belirli bir çizgi yazdırmak için gidiyor çünkü true veya false dönmek için gidiyor.

Ben, muhtemelen iki for döngüler yazmak zorunda kalacak hem muhtemelen input4 ve input5 ve mantıksal && işlenenle if açıklamada çeşit için düşünüyorum, ama emin değilim.

cevap

23

Nispeten asal olmaları durumunda, en büyük ortak ayırıcı birdir, çünkü - aksi taktirde - her iki sayı da bu sayıya bölünebilir. (N günlük) böylece olduğu hangi Ç yılında

private static boolean relativelyPrime(int a, int b) { 
    return gcd(a,b) == 1; 
} 

Öklid algoritması eser: o zaman

private static int gcd(int a, int b) { 
    int t; 
    while(b != 0){ 
     t = a; 
     a = b; 
     b = t%b; 
    } 
    return a; 
} 

Ve: Yani biz sadece örneğin Euclid's method için, en büyük ortak bölücü hesaplamak için bir algoritma gerek O (sqrt n)'a göre optimize edilebilen tüm potansiyel bölenler üzerinde numaralandırılmasından daha hızlıdır.

+0

Bu çok yardımcı olmasına rağmen, profesörüm bana ileri okuma ve bunun hakkında bilgi edinmek için bana sahne verse de, bu ödevle ilgili gcd yöntemini kullanamıyorum da, – Tony

+0

@Tony: iyi bir şekilde (ilk kod parçasını ekleyiniz) . 'gcd' - bildiğim kadarıyla - Java standart kütüphanesinde uygulanmadı. –

0
package stack; 

import java.util.Scanner; //To read data from console 

/** 
* 
* @author base 
*/ 
public class Stack { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); // with Scanner we can read data 
     int a = in.nextInt(); //first variable 
     int b = in.nextInt(); //second variable 
     int max; // to store maximum value from a or b 
     //Let's find maximum value 
     if (a >= b) { 
      max = a; 
     } else { 
      max = b; 
     } 
     int count = 0; // We count divisible number 
     for (int i=2; i<=max; i++) { // we start from 2, because we can't divide on 0, and every number divisible on 1 
      if (a % i == 0 && b % i==0) { 
       count++; //count them 
      } 
     } 
     if (count == 0) { // if there is no divisible numbers 
      System.out.println("Prime"); // that's our solutions 
     } else { 
      System.out.println("Not Prime"); //otherwise 
     } 
    } 
} 

Bence bu basit bir çözümdür. Yorumlarda soru sor.

+5

Lütfen özellikle OP bir ödev için yaptığı için cevabınızı açıklayın. Kodunuzu kopyalayıp yapıştırırsa, hiçbir şey öğrenmez. – FlyingPiMonster

+0

Bu doğru olsa da, aslında çok şey öğrendim. Max'i başlatmanın programın yapması gereken iş miktarını azaltacağını düşünmedim. Ayrıca, mantıklı bir && işlecini düşündüğüm şekilde kullanmamış. Ben de sayımı kullanmayı düşünmedim ve 0'a eşit bir sayımın şartını yapmak, onu en baştan belirleyecekti. Bu daha mantıklı bir soruydu. Kodlamayı iyi anlayabilirim. Gönderiminiz için Beezy'e ve öğrenme deneyimim için endişeleri gidermek için kittycat3141'e teşekkür ederim. – Tony

+1

@ kittycat3141, hmm, Bana öğretmemi istedi mi? Bu, sorunlu sorularınızı sorduğunuz ve onların cevaplarını aldığınız SO. – BSeitkazin

0

Swift w @ williem-van-onsem için kod;

func gcd(a: Int, b: Int) -> Int { 
    var b = b 
    var a = a 
    var t: Int! 

    while(b != 0){ 
     t = a; 
     a = b; 
     b = t%b; 
    } 
    return a 
} 

func relativelyPrime(a : Int, b: Int) -> Bool{ 
    return gcd(a: a, b: b) == 1 
} 

Kullanım;

print(relativelyPrime(a: 2, b: 4)) // false 
İlgili konular