2017-06-04 51 views
0

我有以下3操作:如何获得从4开始的数字并进行转换?

  1. 在数(13成为134)的末尾添加4
  2. 在数字的末尾加上0(13变成130)。
  3. 如果数量甚至通过2.

使用这些操作和从4开始把它我必须计算的用户输入数目和输出由每个操作的值。对于n = 7它应该输出3 3 1 3,因为((((4/2)/2) * 10) + 4)/2 = 7。我只是找不到解决方案。我只是写了一些代码来输出结果为n = 5。n小于100.000

#include <stdio.h> 
#include <stdlib.h> 

int one(int n) 
{ 
    printf("1 "); 
    return n * 10 + 4; 
} 

int two(int n) 
{ 
    printf("2 "); 
    return n * 10; 
} 

int three(int n) 
{ 
    printf("3 "); 
    return n/2; 
} 

int main() 
{ 
    int n; 
    scanf("%d", &n); 
    three(two(three(three(n)))); 
    return 0; 
} 

有人能帮我吗? 谢谢!

编辑! 以下图片将显示某些输入的预期结果。 enter image description here

+2

这对我来说没有意义:每个操作是如何选择的?它与用户输入有什么关系?这里的实际算法是什么? – UnholySheep

+0

你尝试过什么吗? –

+0

@UnholySheep这是我的问题。我不知道。我只需要一个数字,也许有一个变量初始化为'4'并计算数字。 –

回答

2

这可以通过动态编程来完成。

说出用户输入n = K。您可以通过三种方式达到K.

If K has 4 or 0 as last digit, then from the number formed by removing last digit. 
Else from 2 * K 

所以如果预填充的方式来覆盖每一个号码,则可以从输入数原路返回到起始号码4.

允许S在阵列中存储一对数字,即先前从数量和方法可以到达S。可以有多种方式来达到S,但你可以存储任何。例如 ,例如S[44] = {88,3} or {4,1}

但困难的任务是找到数组的上限,直到预先填充的位置。 N的最大值可以是100. 100可以从10实现,所以不成问题。让我们检查人数较少

99 <- 198 <- 396 <- 792 <- 1584 <- 158 
98 <- 196 <- 392 <- 784 <- 78 

所以预填充数据时,要求直到S [1584]

M = 1584
让填充数组S。最初设置的S所有索引到null

for i from 1 to M 
    if i has 0 or 4 at unit place 
     S[i] = {no formed by removing unit place digit, method 1 or 2} 

     There are gaps remaining which were to be filled by method 3, lets also fill them, i/2 and furthur if i is even 
     J = i 
     k = i/2 
     while(j is even and S[k] is null) 
      S[k] = {j, 3} 
      j = k; 
      k = j/2 

当所有S中所有填充,让在原问题 N = 7给予做对于s一些值如下

S[1] = {2,3} 
S[2] = {4,3} 
S[3] = {6,3} 
S[4] = {0,1} 
S[5] = {10,3} 
S[6] = {12,3} 
S[7] = {14,3} 
S[8] = {16,3} 
S[9] = {18,3} 
S[10] = {1,2} 
S[11] = {22,3} 
S[12] = {24,3} 
S[13] = {26,3} 
S[14] = {1,1} 

S[7] = {14,3} , so store 3 and check for 14 
S[14] = {1,1}, so store 1 and check for 1 
S[1] = {2,3}, so store 3 and check for 2 
S[2] = {4,2}, so store 3 and 4 is reached, and you are done. 

打印存储的值反格式是3,3,1,3。

+0

@Timotel对此有帮助吗? –

+0

我想我已经写了一个更简单的方法,但这个想法与你的想法很相似。我从'number'开始,到达'4',将操作数存储在一个数组中,并以相反的顺序打印出数组。 –

+0

你如何找到达到4的方法? –

相关问题