【HDU】1032 The 3n + 1 problem
2018-03-15 09:29
369 查看
[align=left]问题描述[/align]计算机科学中的问题通常被归类为属于某类问题(例如,NP,Unsolvable,Recursive)。在这个问题中,您将分析一个算法的属性,该算法的分类对于所有可能的输入都是未知的。
考虑以下算法:
1.输入n
2.打印n
3.如果n = 1,则停止
4.如果n为奇数,则n <-3n + 1
5.否则n < - n / 2
6.转到2
给定输入22,将打印下列数字序列22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
据推测,上述算法将终止(当打印1时)任何积分输入值。尽管该算法很简单,但这个猜想是否属实却是未知数。然而,已经证实,对于所有整数n使得0 <n <1,000,000(事实上,对于比这更多的数字)给定输入n,可以确定打印的数字的数量(包括1)。对于给定的n,这称为n的周期长度。在上面的例子中,22的周期长度是16. 对于任何两个数字i和j,您将确定i和j之间所有数字的最大周期长度。
[align=left]输入[/align]输入将包含一系列的整数i和j对,每行一对整数。所有整数将小于1,000,000且大于0.
您应该处理所有整数对,并为每对确定i和j之间(包括i和j)之间的所有整数的最大周期长度。
您可以假定没有操作溢出32位整数。[align=left]输出[/align]对于每对输入整数i和j,您应该输出i,j以及i和j之间(包括i和j)之间的整数的最大周期长度。这三个数字应该由至少一个空格分隔,所有三个数字在一行上并且每行输入使用一行输出。整数i和j必须以它们出现在输入中的相同顺序出现在输出中,并且后面应跟着最大循环长度(在同一行上)。
[align=left]示例输入[/align]1 10
100 200
201 210
900 1000 [align=left]示例输出[/align]1 10 20
100 200 125
201 210 89
900 1000 174 这道题算是一道简单的水题,但是在做的时候还是遇到了一些小bug,最开始的代码没有考虑每行输入的两个数的大小,结果“wrong answer”了。代码如下:#include <stdio.h>
int main() {
int m,n,max,num,i,flag,temp;
while (scanf("%d %d",&m,&n)!=EOF)
{
printf("%d %d ",m,n);
if(m>n) //交换m,n
{
temp=m;
m=n;
n=temp;
}
max=0; //每一行循环开始时,要把max归零
for(i=m;i<=n;i++)
{
flag=i;num=1; //注意num要从一开始
while (flag!=1) //也可以写成 while(flag-1)
{
if(flag%2!=0)
flag=flag*3+1;
else
flag=flag/2;
num++;
}
if(max<num)
max=num;
}
printf("%d\n",max);
}
return 0;
}
考虑以下算法:
1.输入n
2.打印n
3.如果n = 1,则停止
4.如果n为奇数,则n <-3n + 1
5.否则n < - n / 2
6.转到2
给定输入22,将打印下列数字序列22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
据推测,上述算法将终止(当打印1时)任何积分输入值。尽管该算法很简单,但这个猜想是否属实却是未知数。然而,已经证实,对于所有整数n使得0 <n <1,000,000(事实上,对于比这更多的数字)给定输入n,可以确定打印的数字的数量(包括1)。对于给定的n,这称为n的周期长度。在上面的例子中,22的周期长度是16. 对于任何两个数字i和j,您将确定i和j之间所有数字的最大周期长度。
[align=left]输入[/align]输入将包含一系列的整数i和j对,每行一对整数。所有整数将小于1,000,000且大于0.
您应该处理所有整数对,并为每对确定i和j之间(包括i和j)之间的所有整数的最大周期长度。
您可以假定没有操作溢出32位整数。[align=left]输出[/align]对于每对输入整数i和j,您应该输出i,j以及i和j之间(包括i和j)之间的整数的最大周期长度。这三个数字应该由至少一个空格分隔,所有三个数字在一行上并且每行输入使用一行输出。整数i和j必须以它们出现在输入中的相同顺序出现在输出中,并且后面应跟着最大循环长度(在同一行上)。
[align=left]示例输入[/align]1 10
100 200
201 210
900 1000 [align=left]示例输出[/align]1 10 20
100 200 125
201 210 89
900 1000 174 这道题算是一道简单的水题,但是在做的时候还是遇到了一些小bug,最开始的代码没有考虑每行输入的两个数的大小,结果“wrong answer”了。代码如下:#include <stdio.h>
int main() {
int m,n,max,num,i,flag,temp;
while (scanf("%d %d",&m,&n)!=EOF)
{
printf("%d %d ",m,n);
if(m>n) //交换m,n
{
temp=m;
m=n;
n=temp;
}
max=0; //每一行循环开始时,要把max归零
for(i=m;i<=n;i++)
{
flag=i;num=1; //注意num要从一开始
while (flag!=1) //也可以写成 while(flag-1)
{
if(flag%2!=0)
flag=flag*3+1;
else
flag=flag/2;
num++;
}
if(max<num)
max=num;
}
printf("%d\n",max);
}
return 0;
}
相关文章推荐
- HDU1032-The 3n + 1 problem-水题压惊
- hdu——1032——The 3n + 1 problem
- hdu 1032 The 3n + 1 problem (打表)
- hdu 1032 The 3n + 1 problem
- HDU-1032 The 3n + 1 problem
- hdu 1032 && uva 100 The 3n + 1 problem
- hdu 1032 The 3n + 1 problem
- HDU 1032 The 3n + 1 problem
- hdu 1032 The 3n + 1 problem
- hdu 1032 The 3n + 1 problem(水题)
- hdu 1032 The 3n + 1 problem
- hdu-1032-The 3n + 1 problem
- HDU1032 The 3n + 1 problem
- 杭电 HDU 1032 The 3n + 1 problem
- hdu 1032 The 3n + 1 problem
- ACM_HDU 1032 The 3n + 1 problem
- HDU 1032 The 3n + 1 problem 【水题】
- HDU 1032 The 3n + 1 problem(暴力)
- HDU 1032 The 3n + 1 problem
- hdu 1032 The 3n + 1 problem