这里我写了一个关于(3n + 1)问题的程序。这也是UVa的一个问题。我相信这是一个已知的问题。但是当我要在那个在线评判社区提交它时,它发送给我一个时间超过错误。时间限制是3秒。我做了我的小知识可以做的事情。如果有人可以帮我提一些建议,我会很高兴。我的代码是:
#include <iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
int main()
{
int loop=1;
unsigned short *cyclelength;
while(loop=1){
unsigned int x,y,i,j,num,count=0,p,k,c,max;
for(;;){
cout<<"enter two integers. they must not be equal and must be between 1 and 1000000\n";
while(!(cin>>i>>j)){
cout<<"please enter a number\n";
cin.clear();
cin.ignore(1000,'\n');
}
if(i>=1 && i<1000000 && j>=1 && j<1000000 && i!=j){
break;
}
else{
printf("try the whole process again\n");
}
}
if(i>j){
x=i;
y=j;
}
else{
x=j;
y=i;
}/*making x always greater than y*/
cyclelength=(unsigned short *)malloc(1000000 *sizeof(unsigned short));
if (NULL==cyclelength){
printf("process aborted");
return 0;
}
else{
/*solution part for the range of number. and solution for each number put into cyclelength.*/
num=y;
while(num<=x){
p=1;
k=num;
while(k!=1){
if(k%2==0)
k=k/2;
else
k=3*k+1;
p+=1;
}
cyclelength[count]=p;
num+=1;
count+=1;
}
c=0;
max=cyclelength[c];
for(c=0;c<x-y-1;c+=1){
if(max<cyclelength[c+1]){
max=cyclelength[c+1];
}
}
free(cyclelength);
cyclelength = NULL;
cout<<i<<" "<<j<<" "<<max<<'\n';
}
}
}
答案 0 :(得分:3)
问题在于,当在线评判引擎完成提供输入时,您不允许程序结束。您需要检测判断引擎是否已完成提供输入,然后退出程序。
他们的网站Spoiler Alert: This is actually a solution to 3n+1 problem上有一个示例代码(在C中),可以解释这一点。请注意Main中的以下条件。
while (scanf("%d %d\n",&m,&n)==2){//perform logic}
这将使程序仅在有待处理的输入时运行。
答案 1 :(得分:0)
如果您的程序在您的电脑上成功运行,但在您提交任何在线评审社区时,时间限制超出了问题。确保您的算法效率最高。在线评判社区为任何程序设定了时间限制,以便高级平均程序员只能设计他们的算法。在尝试将其编程到任何在线评判社区之后,尝试使您的编程算法最佳。如果您在程序中使用>=
或<=
等任何测试,则运行程序需要花费太多时间。