1

在这里,我编写了一个关于 (3n+1) 问题的程序。这也是 UVa 的一个问题。我相信这是一个已知问题。但是当我要在该在线法官社区中提交它时,它会向我发送Time Exceeding Error。时间限制为 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';
        }
    }
}
4

2 回答 2

3

问题是当在线判断引擎完成提供输入时,您不允许程序结束。您需要检测到判断引擎已经完成输入,然后退出程序。

在他们的网站上有一个示例代码(C 语言)Spoiler Alert:这实际上是 3n+1 问题的解决方案,可以解释这一点。请注意 Main 中的以下条件。

while (scanf("%d %d\n",&m,&n)==2){//perform logic}

这将使程序仅在有要处理的输入时运行。

于 2012-07-22T13:51:20.730 回答
0

如果您的程序在您的 PC 上成功运行,但在您在任何在线法官社区提交时给出了超出时间限制的问题。可以肯定的是,您的算法不是最有效的。在线法官社区为任何程序设置了时间限制,这样平均水平较高的程序员只能设计他们的算法。尝试使您的编程算法最好,然后尝试将其带到任何在线法官社区。如果您正在使用任何类似>=<=在您的程序中的测试,则运行您的程序需要花费太多时间。

于 2012-09-04T17:51:39.000 回答