问题:考虑以下算法来生成数字序列。从整数 n 开始。如果 n 为偶数,则除以 2。如果 n 为奇数,则乘以 3 并加 1。使用新的 n 值重复此过程,当 n = 1 时终止。输入将由一系列整数对组成 i 和j,每行一对整数。所有整数都将小于 1,000,000 且大于 0。对于每对输入整数 i 和 j,按照它们在输入中出现的相同顺序输出 i、j,然后是介于 i 和包括 i 和j. 这三个数字应该用一个空格分隔,所有三个数字都在一行上,每行输入对应一行输出。
样本输入:
1 10
样本输出:
1 10 20
所以我写了这个:
#include <stdio.h>
#include <string.h>
struct line{int in1;int in2;int result;};
int cycle(int in);
int main(int argc, char *argv[]) {
int cycle(int in);
char c;
int firstIn=0;
struct line l[500] ;
int pointer=0;
while(2<3){
l[pointer].in1=0;
l[pointer].in2=0;
scanf("%u %u",&l[pointer].in1,&l[pointer].in2);
if(l[pointer].in1<1||l[pointer].in2<1){
break;
}
int maxCyc=0;
int j,m;
int min,max;
if(l[pointer].in1>l[pointer].in2){
max=l[pointer].in1;
min=l[pointer].in2;
}
else{
max=l[pointer].in2;
min=l[pointer].in1;
}
for(j=min;j<=max;j++){
m = cycle(j);
if(m>maxCyc)
maxCyc=m;
}
l[pointer].result=maxCyc;
printf("%d %d %d\n",l[pointer].in1,l[pointer].in2,l[pointer].result);
pointer++;
}
}
int cycle(int in){
int cyc = 1;
while(in>1){
if(in%2==0){
cyc++;
in=in/2;
}
else{
cyc++;
in=in*3+1;
}
}
return cyc;
}
它完全可以,但是当您更改while(in>1)
循环方法时,while(in!=1)
它会变得更慢。我的问题是为什么?!
时间
while(in>1)
:0.683 秒当它的时候
while(in!=1)
:我等了超过 5 分钟还没有发生任何事情:)输入:1 1000000
没有无限循环或其他东西,因为根本in
不能低于 1(因为它必须已经是 1)。
此致