2012-04-13 17 views
1

インタビューストリートの挑戦に問題があります。多分、最も簡単なすべての課題です。 "Unfriendly Numbers"は、このような名前と質問です。プログラムで不明なエラー:不幸な数字

フレンドリーナンバーとNフレンドリーナンバーがあります。われわれはフレンドリーナンバーを正確に分ける数がどれくらいあるのかを知りたいが、不公平な数は分けない。

入力形式: 入力の最初の行には、スペースで区切られた2つの数字NとKが含まれています。 Nは不親切な数字の数、Kはフレンドリーな数字です。 2番目の入力行にはN個のスペースで区切られた不公平な数字が含まれています。

出力形式: 回答を1行に出力します。

私はこのようなPHPプログラミングました:

<?php 
/* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
$handle = fopen ("php://stdin","r"); 
$input = fgets($handle); 
$num_unfriendly_number=substr($input,0,1); 
$friendly_number=substr($input,2,1); 
$input2=fgets($handle); 
for($i=0;$i<=($num_unfriendly_number); $i=$i+2){ 
    $unfriendly_numbers[$i]=substr($input2,$i,1); 

} 
//truncates additional input 

//now getting divisiors of given friendly numbers 

$check_num=1; 
//one is always a divisor of any number 
$divisior[0]=1; 
$arrayindex=1; 
for($check_num; $check_num<=$friendly_number; $check_num++){ 

    $hold_var=$friendly_number%$check_num; 
    if($hold_var==0){ 
     $divisor[$arrayindex]=$check_num; 
     $arrayindex++; 
    } 

} 
$index=0; 
foreach($divisor as $test_div){ 
    $output=true; 
    foreach($unfriendly_numbers as $test_unfrnd){ 
     if($test_unfrnd%$test_div){ 
      $output=false; 
     } 
    } 
    if ($output){ 
     $outputarray[$index]=$test_div; 
     $index++; //edited afterwards after @Boris's suggestion but didn't work :(
    } 
} 
$num_of_output=count($outputarray); 
define('STDOUT',fopen("php://stout","r")); 
fwrite(STDOUT,$num_of_output); 
?> 

上記のプログラムは、2つのテストケースのためにうまく働いたが、他のテストのために適用されませんでしたが。私はいくつかの研究を行ったが、何の誤りも見出さなかった。何か助けてください。前もって感謝します。

+0

codereviewがこれに適しているように見えます。 – bdares

+0

使用するアルゴリズムを記述する方が良いでしょう。 –

+0

@PriyankBhatnagar私はブルートフォースが最善の記述だと思います。たぶん私はここで助けることができます:彼はフレンドリーナンバーのすべての除数を見つけて、不親切な数字のいずれかを分割するすべての除数を除外します。 –

答えて

2

すべての主旨私はPHPを知らないと言いたいと思います。しかし、これは私が手伝ってくれるほど簡単だと思います。私が見

いくつかのエラー:ここ

for($i=0;$i<=($num_unfriendly_number); $i=$i+2){ 
    $unfriendly_numbers[$i]=substr($input2,$i,1); 
} 

あなたがsubstr($input2,$i,1);を使用し、これはしかし、すべての非友好的な数字は常にそうではないかもしれない数字、ある前提としています。より良いPHPの分割機能を使用します。その後

$unfriendly_numbers = explode(" ", $input2); 

ここ
$index=0; 
foreach($divisor as $test_div){ 
    $output=true; 
    foreach($unfriendly_numbers as $test_unfrnd){ 
     if($test_unfrnd%$test_div){ 
      $output=false; 
     } 
    } 
    if ($output){ 
     $outputarray[$index]=$test_div; 
    } 
} 

あなたが$index変数を増やすことはありません以下にしながら、全体を交換してください。これは、あなたが他のものとの約束を上書きするという意味ではありませんか?オペレータ[]=を使用してください。これは、PHPの配列に追加:私は見

if ($output){ 
    $outputarray []= $test_div; 
} 

EDITつ以上のエラーは、あなたがあまりにも数字であることを友好数に数えることです。あなたもこの問題を解決することができます

$friendly_number=substr($input,2,1); 

- >

$friendly_number=explode(" ", $input)[0]; 
+0

エラーを指摘していただきありがとうございます。しかしそれはいずれも助けにはなりませんでした。私がしようとしているのは、フレンドリーナンバーを正確に分ける番号または除数を得ることですが、不公平な数字を分けることはありません。 – cipher

+0

@cipherはい、あなたはそれを正確にやっているようです。あなたはもっとうまくいかないことができますか?私はコードを目で見ているだけで、すべてのエラーが見つからないことがあります。 –

+0

プログラムは出力として1を返します。構文が正しいと私はセマンティクスをチェックアウトしています。とにかく、ありがとうございました。私は、いくつかのチェックはerror_freeプログラムの結果になると思います – cipher

0

を、私は、このコードは以下の16秒でフィニッシュすることができない理由を私は理解できない同じ問題を抱えています!2 5 7 4 3 8 3 18

al = a.split() 

bl = b.split() 

blint = [] 

fn = int(al[1]) 
fnlist = [fn] 

half_fn = fn/2#のみI:8 16 b = raw_input()#これは、この行を読み込みます:私は

a = raw_input()#これは、この行を読み込みますあなたのトリックを聞きたい 数字を半分にして時間を節約してください。

k = 1 

while k <= half_fn: 
    if fn % k == 0: 
     fnlist.append(k) 
    k += 1 

plist = [] 
for j in bl: 
    blint.append(int(j)) # here I changed the bl list elements which are string to int 

for i in fnlist: 
    for j in blint: #I have the int elements so I don't need every time bring the string and change it to int 
     if j % i == 0: 
      plist.append(i) 
      break 
counter = len(fnlist) - len(plist) 
print counter