Bir takım faktörler alın

5 Cevap php

Verilen bir dizi (n), öyle ki, iki faktör (x, y) almak gerekir:

  • x * y <= n
  • x * y mümkün olduğunca n gibi yakın olmalı
  • x ve y, mümkün olduğu kadar birbirine yakın olmalıdır.

Örnekler:

  • n = 16 => x = 4, y = 4
  • n = 17 => x = 4, y = 4
  • n = 18 => x = 6, y = 3,
  • n = 20 => x = 5, y = 4

Herhangi bir dil yapmak ama tercihen php olacaktır.

EDIT - AÇIKLAMA

Ben bir dikdörtgen oluşturmak istiyorsanız, uzun boylu x birimleri geniş * y birimleri kendi alanı mümkün olduğunca n kadar yakın olduğunu böyle. x ve y tamsayı olmalıdır. N asal sayı ise n faktörler - 1 kabul edilebilir.

5 Cevap

Sizin özellikler yeterli oldukça kesin değildi. Eğer 17 faktörler, henüz test halinde 4 is not bir faktör istediğini belirtti

Aşağıdaki sahte kod bir faktör olduğunu planda çalışır exact

for i in range(ceiling(sqrt(n)), 1){
    if ( n modulo i ) == 0 {
          x = i
          y = round(n/i)
    }
}

Nerede bir basit sqrt ifadesi olarak sayıları mümkün olduğunca birbirine yakın olmasını sağlamak için çalışacak, ama onlar faktörler olduğunu garanti etmez.

x = y = round( sqrt(n) )

Size üç kural ne kadar önemli karar vermeniz gerekir.

Possibility 1: x * y mümkün olduğunca n kadar yakın olmak Eğer n o doğrudur = 17 => 1,17 değil 4,4. Bu durumda factorisation istiyor ve orada bunu yapmak için birçok yolu vardır, ancak bu gibi bir kod basittir:

for(i = floor(sqrt(n)) .. 1) {
  if n % i ==0 {
     x = i;
     y = n/x;
     break;
  }
}

Birbirine yakın olmanın daha önemli ise Possibility 2: n = 18 => 4,4 yerine 3,6 beklediğiniz ve bu kod çalışacak. Ancak bu faktör değildir.

x=floor(sqrt(n))
y=floor(n/x)

Yazıldığı gibi sorun daha net bir şartname olmadan çözülemez.

EDIT ------------

Şimdi tekrar imkanı 2 yapıyor ise. Ancak, ben bu şüphe spec artık tanımlanır düzenlendi, ama sonuç, daha sonra başbakan (1 değerlerden biridir) ve olup olmadığını görmek, imkanı 1 yapmanız gerekenler hangisi öğretmen amaçlanan ödev olarak yazdı.

Bir fikir benden (daha fazla sahte sonra php)

$root = sqrt($inputNumber);

$x = floor($root);
$y = floor($root);

if(($root - $x) > 0.5) $y++;

Aşağıdaki kodu kullanarak bir dizi yazılmış tüm faktörleri olurdu.

#Application lists all factors/divisors for a number.
targetNumber=input('What number do you want the factors for?\n> ')
factors=[]
for i in range(1,targetNumber):
    if targetNumber%i==0:
        factors.append(i)
    elif targetNumber/i==1:
        factors.append(targetNumber)
        break
print factors

Sonra olanlar aslında kullanılabilecek kontrol etmek için dizi aracılığıyla döngü olur. Bu algoritma hakkında daha fazla bilgi için, check out http://pyfon.blogspot.com.au/2012/09/list-factors-of-number-in-python.html

İşte iki 'faktör' kesin faktörleri olan üzerinde birbirine yakın olmak öncelik bir PHP fonksiyonu:

function weird_factors($ori) {
	$sq = intval(sqrt($ori));
	$start = $sq - 10;
	$end = $sq + 10;
	$n = 0;
	for ($s = $start; $s <= $end; $s++) {
		for ($t = $start; $t <= $end; $t++) {
			$st = $s * $t;
			if ($st <= $ori and $st > $n) {
				$n = $st;
				$ns = $s;
				$nt = $t;
			}
		}
	}
	return array($ns, $nt);
}