-1

Cで最大合計連続サブ配列を見つけるコードを書いています。私によるとロジックは問題ないようですが、それでも出力は正しくありません。コードを調べてください。3 つのループでは、2 番目のループが最初の値から実行され、最初のループの値が固定され、3 番目のループがサブ配列の合計を取得します。コードを調べてください。

#include<stdio.h>
int A[10],i,j;
void lsa(int A[],int n)
{
    int m,l,z,max=0,sum;
    for(m=0;m<n;m++)
    {
        sum=0;
        for(l=0;l<n;l++)
        {
            for(z=m;z<=l;z++)
            {
                if(m==l)                 //maximum sum from a contiguous sub array
                {
                }
               else
                {
                    sum=A[z]+A[l];
                    if(sum>max)
                    {
                        max=sum;
                        i=m;
                        j=l;
                     }
                 }
             }
        }
    }
}
void main()
{
    int n,p;
    printf("enter size of array\n");
    scanf("%d",&n);
    printf("enter array elements\n");        //creation of array
    for(p=0;p<n;p++)
        scanf("%d",&A[p]);
        lsa(A,n);
        printf("sub array is\n");
        for(p=i;p<j;p++)
        {
             printf("%d ",A[p]);
        }
}
4

1 に答える 1

0

あなたのコードには多くの問題があります。

関数の最初のforループには、次のmainものがあります。

for(p=0;p<n;p++)
    scanf("%d",&A[i]);
  • iグローバル変数であり、初期化されていないため、要素を要素に適切にスキャンしていません

  • lsa上記の for ループが修正されても正しい結果を生成しない関数を台無しにしました

  • 10コードの制限の 1 つは、サイズ以下の配列に対してのみ機能することです。


あなたが言ったように、あなたが最大の連続した配列を見つけたい方法を理解しています:

  • 2 番目のループは、最初のループの値を固定したまま、最初の値から実行されます。
  • 3番目のループは、サブ配列の合計を取得することです

3 番目のループを作成してコードを乱雑に見せる代わりに、部分配列の合計を計算する別の関数に分割する方がよいでしょう。


解決 :

ここでは、任意のサイズの配列で機能するソリューションを提供しました...動的配列割り当てを使用するだけです

「最大連続サブアレイ」のlsa

  • メイン関数、関数宣言、およびグローバル変数は次のとおりです。

(説明はコメントで与えられます)

#include <stdio.h>
#include <stdlib.h>

//array pointer
int *array;
//size of lsa and its starting index value, same as i,j in your code
int lsa_size=1,lsa_start_index=0;

//function to find sum of sub array
int sum(int size_of_array, int start_index);

//the lsa function in your code
void lsaf(int *array,int size_of_array);

//main funtion
int main()
{
    int size, index;

    //scanning size of input array
    printf("enter size of array\n");
    scanf("%d",&size);

    //creates required amount of space for array
    array=malloc(size*sizeof(int));
    if(array==NULL) //check if successfully created or not
    {
        //if not successful exit by returning 1
        printf(" memory creation unsuccessful\n enter any key to exit : ");
        exit(1);
    }

    //input of array elements
    printf("enter array elements\n");
    for(index=0 ; index < size ; index++)
        scanf("%d",&array[index]);

    //function call ... function described below
    lsaf(array,size);

    //printing largest contiguous sub-array
    printf("answer : ");
    for(index=0 ; index < lsa_size ; index++)
    {
        printf("(%d)->",array[lsa_start_index]);
        lsa_start_index++;
    }

    printf("*end*\n\n");

    //freeing allocated memory
    free(array);

    return 0;
}//main function

さて、lsa関数を見つけます(私はそれを と名付けましたlsaf):

void lsaf(int *array,int size_of_array)
{
    int subarray_size,start_index,number_of_arrays;
    int lsa_sum=sum(1,0);//initializing sum of lsa as first element
    int subarray_sum;

    for(subarray_size = 1; subarray_size <= size_of_array ; subarray_size++)
    {
        number_of_arrays = size_of_array - subarray_size +1;
        for(start_index=0;start_index < number_of_arrays ; start_index++)
        {
            subarray_sum=sum( subarray_size,start_index);
            if(subarray_sum >= lsa_sum)
            {
                //updating lsa size and starting index
                lsa_sum=subarray_sum;
                lsa_size=subarray_size;
                lsa_start_index=start_index;
            }
        }//start_index loop
    }//subarray_size loop
}//lsaf function
  • 最初のループはサブ配列のサイズを決定します
  • 2 番目のループは、サブ配列の開始インデックスを決定します

3 番目のループの代わりに、関数を作成しましたsum()。これは、サブ配列の要素の合計を計算します。

int sum(int size_of_array, int start_index)
{
    int add=0,index;
    for(index=0; index < size_of_array ; index++)
    {
        add+=array[start_index];
        start_index++;
    }
    return add;
}//sum function
  • そのため、3 つのループを作成する代わりに、3 番目のループ用の関数を作成し、それを呼び出してサブ配列の合計を計算します

上記の機能を理解していただければ幸いです...疑問がある場合は、コメントでお気軽にお問い合わせください:)


したがって、コードをすべてまとめると、次のようになります。

#include <stdio.h>
#include <stdlib.h>

//array pointer
int *array;
//size of lsa and its starting index value
int lsa_size=1,lsa_start_index=0;

//function to find sum of sub array
int sum(int size_of_array, int start_index);

//the lsa function
void lsaf(int *array,int size_of_array);

//main funtion
int main()
{
    int size, index;

    //scanning size of input array
    printf("enter size of array\n");
    scanf("%d",&size);

    //creates required amount of space for array
    array=malloc(size*sizeof(int));
    if(array==NULL) //check if successfully created or not
    {
        //if not successful exit by returning 1
        printf(" memory creation unsuccessful\n enter any key to exit : ");
        exit(1);
    }

    //input of array elements
    printf("enter array elements\n");
    for(index=0 ; index < size ; index++)
        scanf("%d",&array[index]);

    //function call
    lsaf(array,size);

    //printing largest contiguous sub-array
    printf("answer : ");
    for(index=0 ; index < lsa_size ; index++)
    {
        printf("(%d)->",array[lsa_start_index]);
        lsa_start_index++;
    }

    printf("*end*\n\n");

    //freeing allocated memory
    free(array);

    return 0;
}//main function


int sum(int size_of_array, int start_index)
{
    int add=0,index;
    for(index=0; index < size_of_array ; index++)
    {
        add+=array[start_index];
        start_index++;
    }
    return add;
}//sum function


void lsaf(int *array,int size_of_array)
{
    int subarray_size,start_index,number_of_arrays;
    int lsa_sum=sum(1,0);//initializing sum of lsa as first element
    int subarray_sum;

    for(subarray_size = 1; subarray_size <= size_of_array ; subarray_size++)
    {
        number_of_arrays = size_of_array - subarray_size +1;
        for(start_index=0;start_index < number_of_arrays ; start_index++)
        {
            subarray_sum=sum( subarray_size,start_index);
            if(subarray_sum >= lsa_sum)
            {
                //updating lsa size and starting index
                lsa_sum=subarray_sum;
                lsa_size=subarray_size;
                lsa_start_index=start_index;
            }
        }//start_index loop
    }//subarray_size loop
}//lsaf function

入力と出力の例:

enter size of array
6
enter array elements
1
-3
0
2
11
-90
answer : (0)->(2)->(11)->*end*
于 2016-06-15T17:29:02.790 に答える