1

ここで私は(3n + 1)問題に関するプログラムを書きました。それはUVaからの問題でもあります。これは既知の問題だと思いますが、そのオンライン裁判官コミュニティに提出しようとすると、TimeExceedingErrorが送信されます。制限時間は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)があります。スポイラーアラート:これは実際には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 に答える