问题描述:这是一个古老的猜想:给定任何一个正整数n,对它进行以下操作:n是偶数:n=n/2n是奇数:n=3*n+1这样经过多步操作后,最后必定变为1如对13进行操作: 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1一共经历了9次操作,则称13这个数的周期是9输入:多组测试数据,每组一行,一行里有两个数m和n,请你找出m和n之间(包括m,n)的周期最大的数的周期其中m,n均小于1e5输出:m,n之间周期最大的数的周期,一个结果单独占一行样例输入:1 102 330 100样例输出:197118难度:very easy 習題來源:飞燕之家C/C++语言学习论坛 解決代碼: // NPlusOnePro.cpp : Defines the entry point for the console application.// #include "stdafx.h"#include <malloc.h>#include <memory.h>#include <assert.h>#define INT_UPLIMIT 1#define INT_DOWNLIMIT 500 //foward declaration //the prototype of functions //check input's validationbool IsLegalInput(int iSNum,int iENum); //calculate every number's cyclevoid CalculteCycle(int iSNum,int iENum,int *pSave,int iSize); //calculate the number's cycleint GetCycle(int iTheNum,int iCount); //get the maxsimum number in cycle-arrayint GetMaxCycle(int *pSave,int iSize); int _tmain(int argc, _TCHAR* argv[]){ int iStartNum=0,iEndNum=0; int iIntervalNum=0; int *pTemptResult=NULL; int iResult=0; while(scanf("%d %d",&iStartNum,&iEndNum)) { //check input's validation if(!IsLegalInput(iStartNum,iEndNum)) { printf("input invalidate!"); break; } //Initlization iIntervalNum=iEndNum-iStartNum+1; pTemptResult=(int *)malloc(iIntervalNum*sizeof(int)); assert(pTemptResult!=NULL); memset(pTemptResult,0x00,iIntervalNum*sizeof(int)); //start to deal with //calculate every number's cycle and conserve in ponter pTemptResult CalculteCycle(iStartNum,iEndNum,pTemptResult,iIntervalNum); //get the final result iResult=GetMaxCycle(pTemptResult,iIntervalNum); //show result printf("The Maximum Cycle in these numbers is:%d",iResult); } return 0;} //check input's validationbool IsLegalInput(int iSNum,int iENum){ if(iSNum<1||iENum<1) return false; if(iSNum>=iENum) return false; return true;} //calculate every number's cyclevoid CalculteCycle(int iSNum,int iENum,int *pSave,int iSize){ int i=0,j=0; int iCyTempt=0; int* pIntAcc=pSave; for(i=iSNum;i<=iENum;i++) { iCyTempt=GetCycle(i,0); pSave[j]=iCyTempt; j++; if(j>=iSize) break; }} //calculate the number's cycleint GetCycle(int iTheNum,int iCount){ if(iTheNum==1) return iCount; if(iTheNum%2==0) return GetCycle(iTheNum/2,iCount+1); else return GetCycle(iTheNum*3+1,iCount+1);} //get the maxsimum number in cycle-arrayint GetMaxCycle(int *pSave,int iSize){ int i=0,iMaxValue=0; assert(pSave!=NULL); iMaxValue=pSave[0]; for(i=1;i<iSize;i++) { if(pSave[i]>iMaxValue) iMaxValue=pSave[i]; } return iMaxValue;}

评论