最少的操作次数

时间:2012-02-01 13:34:02

标签: algorithm

给定正整数N,我们可以按任意顺序多次应用以下任何操作:

第一次操作:将给定的正整数N加1;如果N是7,则在该操作之后N变为8.如果N是999,则在该操作之后它变为1000.

第二个操作:选择任何数字的出现并用另一个数字替换。 (475-> 479,101-> 111,299-> 199等等)

第三个操作:在N:47的十进制表示的左边添加任何非零数字 - > 247,9999 - > 49999,2474 - > 72474等等。

找到将N更改为幸运数字所需的最小操作次数。(幸运数字是正整数,其十进制表示仅包含幸运数字4和7.例如,数字47,744,4是幸运的, 5,17,467不是。)

实施例

N = 25,答案= 2

N = 46,答案= 1

N = 99,答案= 2

我在LUCKY NUMBER上尝试各种问题时发现了这个问题。 我陷入了这个问题...... 请帮忙..

5 个答案:

答案 0 :(得分:6)

"将数字加1#34;和"将任何非零前导数字添加到数字"是红鲱鱼。

最小操作次数是N中每个数字一个,这是非幸运的。您只需将每个非4位非7位数字更改为4位或7位。

添加前导数字永远不会对您有所帮助,因为无需更长时间。添加1 似乎就像它可能有所帮助,但它只会做两件事:要么它不携带(当你添加到少于9的数字时),在这种情况下,直接替换可以做同样的事情事物,或它携带(当你添加到9),在这种情况下,它只是创建了一个或多个非幸运的零,你现在将需要"修复"用数字替换。

答案 1 :(得分:1)

根据规则,显然,答案是数字减去4或7次出现次数。因此,例如,N = 25,您将每个数字替换为4或7,一次只取一个。对于46,你取6并用4或7代替答案1。

您可以尝试连续模10评估以检查数字是4还是7

$x = the number
$y = 0; #number of non 4 or 7
while($x>0){
   if($x % 10 != 4 && $x % 10 != 7){
      $y++;
   }
   if($x % 10 == 0){
      $y +=4;
   }
   $x = floor($x/10);
}

显然0不可替换进行某些编辑

答案 2 :(得分:1)

只有第二种情况很重要。只需要一个字符串并计算有多少位数不等于4和7

答案 3 :(得分:1)

只考虑第二个操作.........并找到不同于4和7的数字....这就是答案.....不是它......: )

答案 4 :(得分:0)

你可以尝试贪婪的解决方案:

检查数字中的所有数字并计算有多少不是4或7 从上面的操作中获取计数,看看当只加一个数字时会有一个小计数会让你获得Lucky。

从两者中取出分钟 - 这就是解决方案

向N添加前导数字有什么意义?这不会为您提供最佳解决方案。