【发布时间】:2014-07-16 11:03:02
【问题描述】:
问题:考虑以下算法来生成一个序列 数字。从整数 n 开始。如果 n 是偶数,除以 2。如果 n 是 奇数,乘以 3 并加 1。使用新值重复此过程 n,当 n = 1 时终止。输入将由一系列 整数对 i 和 j,每行一对整数。所有整数 将小于 1,000,000 且大于 0。 对于每一对 输入整数 i 和 j,以相同的顺序输出 i、j 出现在输入中,然后是整数的最大循环长度 在 i 和 j 之间,包括 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)。
最好的问候
【问题讨论】:
-
你的意思是“why != is much more faster than ”在标题中?
-
你为什么有
while(2<3)?如果你想要一个无限循环,只需执行例如while(1)。尽管编译器无论如何都会将您的表达式优化为1。 -
这与
<或!=的速度无关。全部取决于循环中的执行次数。 -
如果您认为是运算符使您的代码变慢,请创建一个较小的示例来说明这一点,其中要比较的两个运算符的数量或运算符执行次数相同。
-
是否存在
in=in*3+1;遇到整数溢出并导致in变为负数的任何数字?那么运营商就会有所作为
标签: c performance operators collatz