题目没有传送门 在微信公众号里
直接上题目
题目清楚明白 一看就是一道简单的模拟 一道水题 按照要求直接写出
马上阵亡
错误代码示范如下
#include <bits/stdc++.h>
using namespace std;
int main(){
int i,j,cnt,max=1,m=0;
cin>>i>>j;
for(int n=i;n<=j;n++){
m=n;
cnt=1;
while(m!=1){
if(m%2==0){
m=m/2;
}
else {
m=3*m+1;
}
cnt++;
}
if(cnt>max)
max=cnt;
}
cout<<i<<' '<<j<<' '<<max;
return 0;
}
乍一看当然是对的了 提交之后发现两个错误点 1. 错在不能多组数据测试 2.不能处理输入数据第一个数大于第二个数的情况
#include <bits/stdc++.h>
using namespace std;
int main(){
int i,j,t,cnt,max=1,m=0;
while(scanf("%d %d",&i,&j)!=EOF){
if(i>j){
t=j;j=i;i=t;
}
for(int n=i;n<=j;n++){
m=n;
cnt=1;
while(m!=1){
if(m%2==0){
m=m/2;
}
else {
m=3*m+1;
}
cnt++;
}
if(cnt>max)
max=cnt;
}
printf("%d %d %d\n",i,j,max);
}
return 0;
}
那么会发现 依旧不能AC(UVa上其实可以)
那是因为还有一个问题 问题3.中间计算过程会超过 int溢出,故需要选择 long long。
#include <bits/stdc++.h>
using namespace std;
int main(){
long long i,j,m=0;
int t,cnt,max=1;
while(cin>>i>>j){
if(i>j){
t=j;j=i;i=t;
}
for(int n=i;n<=j;n++){
m=n;
cnt=1;
while(m!=1){
if(m%2==0){
m=m/2;
}
else {
m=3*m+1;
}
cnt++;
}
if(cnt>max)
max=cnt;
}
cout<<i<<' '<<j<<' '<<max;
}
return 0;
}
另外本题还可以是用记忆型搜索 用hashmap进行优化 具体方法我就不会啦