Ackermann Functions
题目:
注意:1.区间的端点可能是反的;2.计算过程中用long long防止溢出。
疑惑,先看两端代码
代码一
#include"stdlib.h"
#include"stdio.h"
int main()
{
int i,j,count,maxcount,pi,temp,maxp,k;
while(scanf("%d %d",&i,&j)==2&&(i||j))
{
if(i>j)
{
temp=i;
i=j;
j=temp;
}
maxcount=0;maxp=i;
for(k=i; k<=j; k++)
{
pi=k;
count=0;
do
{
if(pi%2==0)
{
pi/=2;
}
else
pi=3*pi+1;
count++;
}while(pi>1);
if(count>maxcount)
{
maxcount=count;
maxp=k;
}
}
printf("Between %d and %d, %d generates the longest sequence of %d values.\n",i,j,maxp,maxcount);
}
return 0;
}
运行结果:
代码二:
#include"stdlib.h"
#include"stdio.h"
int main()
{
long long i,j,count,maxcount,pi,temp,maxp,k;
while(scanf("%I64d %I64d",&i,&j)==2&&(i||j))
{
if(i>j)
{
temp=i;
i=j;
j=temp;
}
maxcount=0;maxp=i;
for(k=i; k<=j; k++)
{
pi=k;
count=0;
do
{
if(pi%2==0)
{
pi/=2;
}
else
pi=3*pi+1;
count++;
}while(pi>1);
if(count>maxcount)
{
maxcount=count;
maxp=k;
}
}
printf("Between %I64d and %I64d, %I64d generates the longest sequence of %I64d values.\n",i,j,maxp,maxcount);
}
return 0;
}
运行结果:
疑惑
结果:代码一过了,代码二没过。
两个代码的内容一模一样,唯有 定义的数据类型 不一样。
代码一:int 代码二:long long
按理说,long long 一定可以过,但是没过。说明可能 判题系统本身有问题。(我是在我们学校平台上提交的,应该和uva官网一样的)
总结反思
1.题目本身不难,但是看英文很累,抓不住关键,浪费时间。
要好好理解题意。