问题陈述:
在正整数上,您可以执行以下3个步骤中的任何一个.
从中减去1.(n = n - 1)
如果它可被2整除,则除以2.(如果n%2 == 0,则n = n/2)
如果它可被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个案例,但仍然得出正确的解决方案.我无法遵循通用解决方案的算法.任何让我理解的帮助都会受到极大的赞赏.
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()在这种情况下使用是否安全?如果没有,会出现什么问题?请提出最佳做法.