Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于';好';数_Php_Algorithm_Big O_Dynamic Programming_Pseudocode - Fatal编程技术网

Php 用于';好';数

Php 用于';好';数,php,algorithm,big-o,dynamic-programming,pseudocode,Php,Algorithm,Big O,Dynamic Programming,Pseudocode,如果给定数字x的任意两个连续数字之和在k和2k之间,则该数字x为“好”。 我需要找到一个算法,对于一个给定的数字k和一个给定的数字n,找出存在多少个“好的”n位数 我用PHP实现了这一点,但是复杂性太大了(我正在搜索所有那些“好”的数字并计算它们,所以复杂性是O(10^n)) 是否有人可以确认这是否是解决方案: n=100 // given k=10 // given counter = 0; for(i=10; i<100; i++) { if( (i/10)+(i%1

如果给定数字x的任意两个连续数字之和在k和2k之间,则该数字x为“好”。 我需要找到一个算法,对于一个给定的数字k和一个给定的数字n,找出存在多少个“好的”n位数

我用PHP实现了这一点,但是复杂性太大了(我正在搜索所有那些“好”的数字并计算它们,所以复杂性是O(10^n))


是否有人可以确认这是否是解决方案:

n=100 // given
k=10  // given

counter = 0;

for(i=10; i<100; i++)
{
    if( (i/10)+(i%10) > k ) && ( (i/10)+(i%10) < 2*k )
        counter++;
}

total = counter^(n-1)
n=100//给定
k=10//
计数器=0;
对于(i=10;ik)&((i/10)+(i%10)<2*k)
计数器++;
}
总计=计数器^(n-1)
n
数字和顶部数字
d
查找“不好的数字”是一个简单的动态规划问题

10^n
是“好数字”加上“不好数字”的数字


我不会给你更多的帮助。

所有那些打给
pow
的电话肯定帮不了你

你能做的就是把所有“好”的两位数映射起来。一旦你有了映射,你所需要做的就是检查数字中的每一对数字是否正确。可以通过连续除以10和模100来实现这一点

如果您不给它一个负数,并且假设您已经设置了
$good
数组,那么这样的操作就可以实现

function isgood( $num ) {
    while( $num >= 100 && $good[$num%100] ) {
        $num /= 10;
    }
    return $good[$num%100];
}
接下来要做的最明显的事情是记忆较大的序列。这是一个动态规划原理。我们已经通过存储2位序列的“优点”来记忆小序列。但是你可以很容易地用它们来生成3,4,5,6位数的序列。。。只要你的可用内存允许。使用您已有的备忘录,以生成带有一个额外数字的序列


因此,如果你为多达5位的数字建立了记忆,那么你每次除以1000,速度就会大大加快。

你的算法计算出有多少2位整数是不好的。然后将该值返回到
n-1
的幂。这应该可以得到不好的
n
位数。如果从
n
位整数的总数中减去此值,则应得到所需的值。或者我们可以通过改变标志来避免这样做:

for($i=10; $i<100; $i++) {
 if( ($i/10) + ($i%10) > $k && ($i/10) + ($i%10) < 2*$k ) {
  $cnt++;
 }
}
$result = pow($cnt, $n-1);
那么,位置1和2呢?第一个位置是固定的

0 1 2 3 4 5 ...
x y
  y z

因此,我们必须证明,
cnt
对于
z
是有可能的,我不明白为什么会出现这种情况,所以我认为算法是错误的。你的算法可能会计算过多。

很棒的帖子,很好的信息,但对我来说有家庭作业的味道。我们相信你,你能做到!现在它说i%10+i%10是2k。我几乎可以肯定那不是你想要的。尝试翻转<和>,谢谢你指出它,我想放或代替and,现在修复了代码,但仍在寻找它是否是解决方案。你认为该算法为什么应该有效?嗨,最好不要删除一个问题-我想你只能在没有答案的情况下投票删除它。不管怎样,它最好是左边的-这看起来可能对其他人有用。不要担心未申报的dvote,它们会发生在每个人身上。@MoritzRodd当我说“我不会再提供帮助”时,我是认真的。对我来说,你的问题听起来像是额外的家庭作业或竞赛,我不想把它当作一个银盘子交给你。
0 1 2 3 4 5 ...
x y
0 1 2 3 4 5 ...
x y
  y z