Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 인접한 모든 요소 중 하나가 다른 요소를 나누는 배열의 수

<시간/>

'one'과 'another'라는 두 개의 정수가 주어졌습니다. 목표는 다음과 같은 가능한 배열의 수를 찾는 것입니다. -

  • 배열의 요소는 1과 'another' 사이의 범위에 있습니다.

  • 배열의 모든 요소는 arr[i]가 arr[i+1]을 나누거나 arr[i+1]이 arr[i+2]를 나눕니다....등입니다.

  • 배열의 길이는 '1'입니다.

입력

하나 =3, 다른 하나 =2

출력

모든 인접 요소 중 하나가 다른 요소를 나누는 배열의 개수:8

설명

배열은 다음과 같습니다:[ 1,1,1 ], [ 1,1,2 ], [ 1,2,1 ], [ 1,2,2 ], [ 2,1,1 ], [ 2 ,1,2 ], [ 2,2,1 ], [ 2,2,2 ]

입력

하나 =2, 다른 하나 =3

출력

인접한 모든 요소 중 하나가 다른 요소를 나누는 배열의 개수:7

설명

배열은 다음과 같습니다:[ 1,1 ], [ 2,2 ], [ 3,3 ], [ 1,2 ], [ 1,3 ], [ 2,2 ], [ 3,3 ] 

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다. -

우리는 각 배열의 첫 번째 요소가 [1,another] 범위의 모든 숫자가 될 수 있다는 것을 알고 있습니다. 다음 요소는 항상 이전의 배수이거나 이전의 인수이므로 나눗셈 조건이 유지됩니다. 또한 인수 또는 배수는 '다른'보다 작아야 합니다. 동적 프로그래밍을 사용하여 계산을 저장합니다. 이를 위해 배열 arr[][].arr[1][another]는 단일 요소 배열이므로 1이 됩니다. arr[i][j]=arr[i−1][j]+이전 요소의 인수+이전 요소의 배수(다른 것보다 작음).

  • 정수를 하나씩 입력으로 가져옵니다.

  • 인접_요소 함수(int first, int second)는 모든 인접 요소 중 하나가 다른 요소를 나누는 것과 같은 배열의 개수를 반환합니다.

  • 초기 개수를 0으로 취하고 배열 arr[크기][크기]를 가져옵니다.

  • memset을 사용하여 모든 카운트를 0으로 초기화합니다.

  • 인수를 저장하는 vec와 배수를 저장하는 vec_2의 두 벡터를 사용합니다.

  • i=t에서 i=second로, j=2*i에서 j=second로 두 개의 for 루프를 사용하여 트래버스합니다. i만큼 j 증가

  • vec[j]에 i를 추가하고 vec_2[i]에 j를 추가합니다. j 루프 뒤에 i를 vec[i]에도 추가합니다.

  • for 루프를 사용하여 arr[1][i]를 설정합니다.

  • 배열을 다시 탐색하고 이제 vec 및 vec_2를 탐색하고 arr[i][j]에 인수와 배수를 추가합니다.

  • 끝에 모든 arr[first][i]를 추가하여 vec[i] 및 vec_2[i]를 계산하고 지웁니다.

  • 결과로 카운트를 반환합니다.

예시

#include 네임스페이스 std;#define size 1000int peripheral_elements(int first, int second){ int count =0; int arr[크기][크기]; memset(arr, 0, arr 크기); 벡터 vec[크기], vec_2[크기]; memset(vec, 0, vec의 크기); memset(vec_2, 0, vec_2의 크기); for (int i =1, i <=second, i++){ for (int j =2*i, j <=second, j +=i){ vec[j].push_back(i); vec_2[i].push_back(j); } vec[i].push_back(i); } for (int i =1; i <=second; i++){ arr[1][i] =1; } for (int i =2, i <=첫 번째, i++){ for (int j =1, j <=두 번째, j++){ arr[i][j] =0; for (자동 it:vec[j]){ arr[i][j] +=arr[i−1][it]; } for (자동 it :vec_2[j]){ arr[i][j] +=arr[i−1][it]; } } } for (int i =1; i <=second; i++){ count =count + arr[첫 번째][i]; vec[i].clear(); vec_2[i].clear(); } 반환 횟수;}int main(){ int one =2, another =2; cout<<"모든 인접한 요소 중 하나가 다른 요소를 나누는 배열의 개수는 다음과 같습니다. "< 

출력

위의 코드를 실행하면 다음 출력이 생성됩니다 -

인접한 모든 요소 중 하나가 다른 요소를 나누는 배열의 개수는 다음과 같습니다. 4