配列 (arr1 と呼びましょう)、配列のサイズ (n)、および値を取得する再帰プログラムを作成する割り当てがあります。プログラムは、配列に 2 つの数値があり、それらの合計が s であるかどうかをチェックします。たとえば、配列が {1,3,2,0,5} で s=7 の場合、5+2=7 であるため、関数は "yes" を出力します。配列が {1,3,2,0,5} で s=9 の場合、関数は「いいえ」を出力します。ペアの合計が 9 になることはありません。
私のアルゴリズムは次のように機能します: 配列内の最後のスポット (arr1[n-1]) の要約を他のすべてのスポットで計算します。合計が s であるカップルを見つけたら、「はい」と出力して立ち去ります。見つからない場合は同じことを行いますが、arr1[n-1] の代わりに arr1[n-2] をチェックします。最後のスポットを削除します。
これが私のコードです:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void input_array_dyn(int* a, int n);
void rec(int* a,int n, int s);
void main()
{
int n=0,s=0;
int* a;
printf("Enter value S\n");
scanf("%d",&s);
printf("Enter the size of the array\n");
scanf("%d",&n);
a=(int*)calloc(n,sizeof(int));
printf("Enter %d values for the array\n",n);
input_array_dyn(a,n);
rec(a,n,s);
free(a);
getch();
}
void input_array_dyn(int* a,int n)
{
int i=0;
for(i=0;i<n;i++)
scanf("%d",a[i]);
}
void rec(int* a,int n, int s)
{
int i;
if(n==1)
{
printf("There are no 2 number whos summary yields S\n");
return;
}
for(i=0;i<n-1;i++)
{
if(a[n-1]+a[i]==s)
{
printf("There are two numbers that give s\n");
return;
}
}
rec(a,n-1,s);
}
「Test.exe の 0x5846e30e (msvcr100d.dll) で未処理の例外: 0xC0000005: アクセス違反の書き込み場所 0x00000000」というエラーが表示されます。
また、アルゴリズムがこれを行うためのより良いアイデアを持っている人はいますか? :)