角谷猜想的证明

rooftop64 2009-09-04 09:33:51
仍然是Java编程哪些事儿中的练习题。
日本一位中学生发现一个奇妙的定理。请角谷教授证明,而教授无能为力。于是产生了角谷猜想。猜想的内容:任给一个自然数,若为偶数则除以2,若为奇数则乘3加1,得到一个新的自然数后按上面的法则继续演算。若干次后得到的结果必为1。请编写代码验证该猜想。
...全文
1396 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbug9002 2009-09-04
  • 打赏
  • 举报
回复
是不是所有的奇数都会归到5?
o2cola 2009-09-04
  • 打赏
  • 举报
回复
日本一位中学生发现一个奇妙的定理。请角谷教授证明,而教授无能为力。于是产生了角谷猜想。猜想的内容:任给一个自然数,若为偶数则除以2,若为奇数则乘3加1,得到一个新的自然数后按上面的法则继续演算。若干次后得到的结果必为1。请编写代码验证该猜想。

如果一个数是偶数,记做2n,奇数记做2n+1
对偶数操作 2n/2= n
对奇数操作 (2n+1)*3+1 = 6n+4 变成了偶数,记做2n
所以,不管如何,最后都是变成偶数,除到最后必然会得到1因为偶数就是2的倍数
glitterlee 2009-09-04
  • 打赏
  • 举报
回复

public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
int i;
try {
s = br.readLine();
i = Integer.parseInt(s);
System.out.println(i);
while (i != 1) {
if (i % 2 == 0) {
i = i / 2;
System.out.println("偶"+i);
} else {
i = i * 3 + 1;
System.out.println("奇"+i);
}
}
} catch (Exception e) {

}
}
knightzhuwei 2009-09-04
  • 打赏
  • 举报
回复
既然是证明 那假设肯定是成立的 如果能够轻易举出一个自然数成为角谷定理的反例 那该定理早就被推翻了
import java.util.Random;
class Test {
public static void main(String[] args) {
Random r=new Random();
int num=r.nextInt(500);
System.out.println("验证"+num);
for(;num!=1;){
if(num%2==0){
System.out.println(num+"/2="+num/2);
num/=2;
}else{
System.out.println(num+"*3+1="+(num*3+1));
num=num*3+1;
}
}
}
}


验证250
250/2=125
125*3+1=376
376/2=188
188/2=94
94/2=47
47*3+1=142
142/2=71
71*3+1=214
214/2=107
107*3+1=322
322/2=161
161*3+1=484
484/2=242
242/2=121
121*3+1=364
364/2=182
182/2=91
91*3+1=274
274/2=137
137*3+1=412
412/2=206
206/2=103
103*3+1=310
310/2=155
155*3+1=466
466/2=233
233*3+1=700
700/2=350
350/2=175
175*3+1=526
526/2=263
263*3+1=790
790/2=395
395*3+1=1186
1186/2=593
593*3+1=1780
1780/2=890
890/2=445
445*3+1=1336
1336/2=668
668/2=334
334/2=167
167*3+1=502
502/2=251
251*3+1=754
754/2=377
377*3+1=1132
1132/2=566
566/2=283
283*3+1=850
850/2=425
425*3+1=1276
1276/2=638
638/2=319
319*3+1=958
958/2=479
479*3+1=1438
1438/2=719
719*3+1=2158
2158/2=1079
1079*3+1=3238
3238/2=1619
1619*3+1=4858
4858/2=2429
2429*3+1=7288
7288/2=3644
3644/2=1822
1822/2=911
911*3+1=2734
2734/2=1367
1367*3+1=4102
4102/2=2051
2051*3+1=6154
6154/2=3077
3077*3+1=9232
9232/2=4616
4616/2=2308
2308/2=1154
1154/2=577
577*3+1=1732
1732/2=866
866/2=433
433*3+1=1300
1300/2=650
650/2=325
325*3+1=976
976/2=488
488/2=244
244/2=122
122/2=61
61*3+1=184
184/2=92
92/2=46
46/2=23
23*3+1=70
70/2=35
35*3+1=106
106/2=53
53*3+1=160
160/2=80
80/2=40
40/2=20
20/2=10
10/2=5
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
yanliang_xt 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sjkof 的回复:]
引用 5 楼 yanliang_xt 的回复:
我觉得只能证明其成功,不能证明其失败(或者在一定的范围内它是失败的),不然就一直让它无限循环,直到尽关,何处是尽头。
你可以在一个死循环中加一个判断是否等于1如果是1就break;


lz已经使用while(sum!=1)了,所以,判断是1就break多此一举
[/Quote]

我不是针对楼主的代码。是针对楼主在4楼的疑问。
sjkof 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yanliang_xt 的回复:]
我觉得只能证明其成功,不能证明其失败(或者在一定的范围内它是失败的),不然就一直让它无限循环,直到尽关,何处是尽头。
你可以在一个死循环中加一个判断是否等于1如果是1就break;
[/Quote]

lz已经使用while(sum!=1)了,所以,判断是1就break多此一举
yanliang_xt 2009-09-04
  • 打赏
  • 举报
回复
我觉得只能证明其成功,不能证明其失败(或者在一定的范围内它是失败的),不然就一直让它无限循环,直到尽关,何处是尽头。
你可以在一个死循环中加一个判断是否等于1如果是1就break;
rooftop64 2009-09-04
  • 打赏
  • 举报
回复
我觉得代码中的问题就是我先入为主的认为猜想肯定是成立的,所以这样写了。但是假设不成立的话,就会出现死循环。所以想看看大家是怎样通过程序来验证的
还有,上面的代码因为手机输入的关系,格式有问题,请大家凑合着看吧
rooftop64 2009-09-04
  • 打赏
  • 举报
回复
回2楼,我自己能力有限,写出的代码不知道是否正确,想看看论坛里高人们写的。
我毕竟是新人,下面把我的代码贴出来,请大家不要笑话。
public class Jiaogu{
public static void main(String[] args){
int sum = 23456;
while(sum != 1){
if(sum%2 = 0){
sum = sum/2;
}else{
sum = sum*3+1;
}
}
System.out.println("成立");
}
}
  • 打赏
  • 举报
回复
楼主,你不会把 CSDN 的人当作代码工了吧?
dz007 2009-09-04
  • 打赏
  • 举报
回复
好奇怪的猜想,偶数除2结果肯定是1啦……
andycpp 2009-09-04
  • 打赏
  • 举报
回复
有意思

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧