小编lin*_*uza的帖子

算法的正确性和逻辑性:最小步骤为1

问题陈述:

在正整数上,您可以执行以下3个步骤中的任何一个.

  1. 从中减去1.(n = n - 1)

  2. 如果它可被2整除,则除以2.(如果n%2 == 0,则n = n/2)

  3. 如果它可被3整除,则除以3.(如果n%3 == 0,则n = n/3)

给定正整数n并且您的任务是找到将n转换为1的最小步数.

我的递归解决方案(在C++中)比较了N可被3整除的所有3种情况,而一般解决方案只比较2,但仍然给出了正确的解决方案.

int min_steps(int N){ 
        if(N==1) return 0;    
        else{
                if(N%3==0){
                       if(N%2==0) 
                          return (1+min(min_steps(N/3),min_steps(N/2),min_steps(N-1)));
                       else
                          return(1+min(min_steps(N/3),min_steps(N-1)));
                }
                else if(N%2==0){
                        return(1+min(min_steps(N/2),min_steps(N-1)));
                }
                else
                        return(1+min_steps(N-1));
        }
}
Run Code Online (Sandbox Code Playgroud)

但一般的解决方案是,

int min_steps(int N){ 
        if(N==1) return 0;    
        else{
                if(N%3==0){
                        return(1+min(min_steps(N/3),min_steps(N-1)));
                }
                else if(N%2==0){
                        return(1+min(min_steps(N/2),min_steps(N-1)));
                }
                else
                        return(1+min_steps(N-1));
        }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么我们不比较所有3个案例,但仍然得出正确的解决方案.我无法遵循通用解决方案的算法.任何让我理解的帮助都会受到极大的赞赏.

c++ algorithm logic correctness

6
推荐指数
1
解决办法
313
查看次数

这样使用memcpy是否安全?

memcpy(buf, buf + (pos - offset), len);
Run Code Online (Sandbox Code Playgroud)

然而,

0<=pos<=strlen(buf), 0<=offset<=strlen(buf)
Run Code Online (Sandbox Code Playgroud)

memcpy()在这种情况下使用是否安全?如果没有,会出现什么问题?请提出最佳做法.

c review memcpy

-2
推荐指数
1
解决办法
615
查看次数

标签 统计

algorithm ×1

c ×1

c++ ×1

correctness ×1

logic ×1

memcpy ×1

review ×1