【解決方法】正の整数のサイズ N のソートされていない配列 a が与えられた場合、与えられた数 S に追加される連続部分配列を見つけます。


入力:
入力の最初の行には、テスト ケースの数を示す整数 T が含まれます。 次に、T 個のテスト ケースが続きます。各ケースは 2 行で構成されます。各テスト ケースの最初の行は N と S です。ここで、N は aarray のサイズで、S は合計です。テスト ケースの 2 行目は、スペースで区切られた N 個の整数を含みます。配列要素を示します。

出力:
sum が subarray に等しい場合は、テスト ケースごとに、左から最初に出現する部分配列の開始位置と終了位置 (1 インデックス) を新しい行に出力し、そうでない場合は -1 を出力します。
制約 :
1<=T<=100
1<=N<=10^7
1<=A<=10^10
例:
入力:
2
5 12
1 2 3 7 5
10 15
1 2 3 4 5 6 7 8 9 10
出力:
2 4
1 5

私が試したこと:

#include <stdio.h>

int main()
{
    int kases;
    scanf("%d", &kases);
    int kase;
    for(kase = 1; kase <= kases; kase++) {
        int  N;
        scanf("%d", &N);
        int result[1000];
        result[0] = 1;
        int length = 1, i, j, temp, carry = 0;
        for(i = 2; i <= N; i++) {
            for(j = 0; j < length; j++) {
                temp = carry + result[j] * i;
                carry = temp / 10;
                result[j] = temp % 10;
            }
            while(carry) {
                result[j] = carry % 10;
                carry /= 10;
                j++;
            }
            length = j;
        }
        for(int i = length - 1; i >= 0; i--){
            printf("%d", result[i]);
        }
        printf("\n");
    }
    return 0;
}

解決策 1

なるほど、あなたのコードは要件とはまったく関係がありません。コメントも質問もありません。 完全なブローアップ解決策を提供してほしいだけなので、それがあなたのものであると主張できます. それが起こる可能性は低いです。

私たちはあなたの宿題をしません。
HomeWork は、他の人に仕事を頼むスキルをテストするためのものではありません。あなたに考えさせ、受講したコースの理解度と、それらを適用する際の問題点を教師が確認するのを助けるように設定されています。
あなたの失敗は、教師があなたの弱点を見つけ、是正措置を講じるのに役立ちます。
あなたの失敗は、何が機能し、何が機能しないかを学ぶのに役立ちます。これは「試行錯誤」学習と呼ばれます。
ですから、試してみて、レッスンを読み直して、作業を開始してください。 特定の問題で立ち往生している場合は、コードを示して、この正確な問題を説明してください。

プログラマーとして、 あなたの仕事はアルゴリズムを作成することです それは特定の問題を解決するものであり、他の誰かに永遠にそれを任せることはできません。 そして早ければ早いほどよい。
解決策を尋ねるだけでは、他の誰かにトレーニングしてもらい、車の運転を学ぼうとするようなものです。
アルゴリズムを作成することは、基本的に数学を見つけて、実際の問題に合わせて必要な適応を行うことです。

解決策 2

アルゴリズムは単純で、3 つの変数を使用するだけです。

  • beg – 検索された部分配列の最初の項目のインデックス
  • end – サブ配列の最後の項目のインデックス
  • sum – サブ配列項目の合計

1. let beg = 0
2. let sum = array[beg]; end=beg;
3. if sum > S then 
     let beg = beg + 1; goto 2;
   else if sum == S then 
     print( beg + 1, end + 1); exit;
   else // here sum < S
     end = end + 1; sum = sum + array[end]; goto 3;

のコーナーケース 「サブアレイが見つかりません」 は練習問題として残します。

解決策 6

#include
名前空間 std を使用します。
int lower(int Arr[]、整数 N、整数 S)
{
int フラグ = -1;
for (int i = 0; i < N; i++)
{
int 合計 = 0;
for (int j = i; j < N; j++)
{
合計 = 合計 + Arr[j];
if (合計 == S && フラグ == -1)
{
フラグ = 私;
}
}
}
戻りフラグ;
}
int upper(int Arr[]、整数 N、整数 S)
{
int フラグ = -1;
for (int i = 0; i < N; i++)
{
int 合計 = 0;
for (int j = i; j < N; j++)
{
合計 = 合計 + Arr[j];
if (合計 == S && フラグ == -1)
{
フラグ = j;
}
}
}
戻りフラグ;
}
int main()
{
int N;
cout << "配列のサイズを入力してください😄 :: " << endl;
シン >> N;
整数 A[N];
cout << "Enter " << N << " 整数 😄 :: " << endl;
for (int i = 0; i < N; i++)
{
シン >> あ[i];
}
int S;
cout << "求める合計を入力してください😄 :: " << endl;
シン >> S;
int 下限、上限。
下=下(A、N、S);
アッパー = アッパー (A、N、S);
if (下限 == -1 && 上限 == -1)
{
cout << "サブ配列が見つかりません🥲 " << endl;
}
それ以外
{
for (int i = 下限; i <= 上限; i++)
{
cout << A[i] << " ";
}
}
0 を返します。
}

解決策 5

int s=33;
   int ch[]={1, 4, 20, 3, 10, 5};
   int n=sizeof(ch)/sizeof(ch[0]);
   int sum=0, count=1;
 for(int j=0;j<n;j++)
 { sum=0;
     for(int k=j;k<n;k++)
     {
         sum=sum+ch[k];//5 10 12
         if(sum==s)
         {printf("Sum found between indexes %d %d\n",j,k);
             count=count+1;
         }
     }
 }
 if(count<=1)
 {  printf("no subarray found");}

コメント

タイトルとURLをコピーしました