3n+1问题

来源:互联网 发布:客户数据库 编辑:程序博客网 时间:2024/05/17 17:55

今天看到一个3n+1问题,其大致意思是对于输入的任意一个整数n,若其是偶数,则将其除以2 ,若是奇数,则将其乘以3再加1;重复此步骤,其结果必定终止于1。

例如 :输入的数为5,则
  5 16 8 4 2 1

对于上述序列的长度称为n的循环节长度。想要求编写一个程序求某段区间内循环节长度最大的数,并输出。

输入输出示例:

input                output

1 10 1 10 20

100 200 100 200 125

下面是实现代码,其主要运用了递归的算法。笔者水平有限,望读者对程序参考指正。

#include<stdio.h>#include<stdlib.h>static int sum=0;int  asksum(int m){if(m==1){sum++;;return 0;}if(m%2==0){m=m>>1;sum++;return  asksum(m);}else{m=m*3+1;sum++;return asksum(m);}}int main(void){int m=0,n=0,i,j;int *p=0;while(scanf("%d%d",&m,&n)){p=(int*)malloc((n-m+1)*sizeof(int));for(i=m,j=0;i<=n;++i,j++){asksum(i);p[j]=sum;sum=0;}for(j=1;j<n-m+1;++j){if(p[j]>p[0])p[0]=p[j];}printf("%d,%d,%d\n",m,n,p[0]);free(p);}return 0;}


0 0
原创粉丝点击