1

面试街挑战有问题。也许是所有挑战中最简单的。“不友好的数字”,是这样的名字和问题。

有1个友好号码和N个不友好号码。我们想找出有多少数字正好整除友好数字,但不整除任何不友好数字。

输入格式:输入的第一行包含两个数字 N 和 K,用空格分隔。N是不友好号码的数量,K是友好号码。输入的第二行包含 N 个空格分隔的不友好数字。

输出格式:在一行中输出答案。

我做了这样的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 个测试用例运行良好,但没有应用于其他测试。我做了一些研究,但没有发现任何错误。请有任何帮助。提前致谢。

4

2 回答 2

2

首先我要提一下,我不懂php。但是,我认为这很简单,我可以尝试提供帮助。

我看到的几个错误:

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

在这里您使用substr($input2,$i,1);,但这假设您所有不友好的数字都是数字,但情况可能并非总是如此。更好地使用 php.ini 中的 split 函数。将整个 while 替换为以下内容:

$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;
 }

编辑我看到的另一个错误是你指望友好的数字也是一个数字。你也可以解决这个问题:

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

->

$friendly_number=explode(" ", $input)[0];
于 2012-04-13T08:07:16.650 回答
0

我有同样的问题,我不明白为什么这段代码不能在 16 秒内完成!我想听听你的把戏

a = raw_input()# 这将读取这一行:8 16 b = raw_input()# 这将读取这一行: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# 只有我去一半的数字来节省一些时间

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
于 2012-04-15T07:15:51.210 回答