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

C ++에서 프라임으로 짝수와 홀수 위치의 자릿수 합계의 차이가있는 범위의 숫자 계산

<시간/>

두 개의 숫자가 범위 변수로 시작하고 끝납니다. 목표는 이 범위 [start,end]에 있는 숫자의 개수를 찾는 것이며 짝수의 자릿수 합과 홀수 위치 자릿수의 합 차이를 소수로 하는 것입니다.

즉, (짝수 위치의 자릿수 합)-(홀수 위치 자릿수 합) =소수

예를 들어 이해합시다.

예를 들어

입력 - 시작 =230, 끝 =270

출력 - 짝수 및 홀수 위치의 자릿수 합이 소수인 범위의 숫자 개수는 다음과 같습니다. 6

설명 - 조건을 충족하는 230에서 270 사이의 숫자는 다음과 같습니다.

240 ( 4-2 는 2 ), 250 ( 5-2 는 3 ), 251 ( 5-3 은 2 ), 261 ( 6-3 은 3 ), 262 ( 6-4 는 2 ), 270 ( 7-2 5 )입니다.

이 모든 차이는 2, 3, 5이며 소수입니다.

입력 - 시작 =1101, 끝 =1120

출력 - 짝수와 홀수 위치의 자릿수 합이 소수인 범위의 숫자 개수는 다음과 같습니다. 1

설명 - 조건을 충족하는 1101에서 1120 사이의 숫자는 다음과 같습니다.

1120(3-1은 2) 2는 프라임입니다.

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

여기서 우리는 동적 프로그래밍 접근 방식을 사용하고 짝수 및 홀수 위치 자릿수의 합계의 소수 차이가 있는 숫자의 개수를 저장합니다. 이 배열은 arr[크기][90][90][2]입니다. 여기에서 크기는 10의 거듭제곱입니다. 따라서 입력으로 가장 큰 숫자는 10 size 이 됩니다. .

check(int place, int eve, int od, int temp, vector vec) 함수에 대한 각 재귀 호출에서 왼쪽에서 오른쪽으로 0에서 9까지의 숫자를 배치하여 숫자를 만듭니다.

arr[size][x][y][temp]에서 x는 x까지 짝수 자리의 자릿수의 합이고 y는 y까지의 홀수 자릿수의 합입니다. 필요한 차이가 소수인지 100까지의 모든 소수를 순서대로 저장하는 배열 arr_2[]를 사용하지 않는지 확인합니다.

  • 변수를 입력으로 시작하고 종료합니다.
  • 최대 100개의 소수에 대해 전역 배열 arr[size][90][90][2] 및 배열 arr_2[]를 사용합니다.
  • 함수 검사(int place, int eve, int od, int temp, vector vec)는 현재 자릿수를 자릿수로, 이브 위치 자릿수의 현재 합을 짝수로, 홀수 위치 자릿수를 od로, temp 값을 취합니다. 및 숫자가 있는 벡터 vec.
  • 재귀적으로 arr[place][eve][od][temp]의 값을 채웁니다.
  • 현재 요소의 초기값을 count=0으로 취합니다.
  • 현재 위치의 경우 if(place ==vec.size())를 사용하여 place가 마지막 위치인지 확인합니다. 그렇다면 해당 위치가 홀수인지 짝수인지 확인하십시오.
  • if(vec.size() &1) 결과가 true이면 현재 위치가 홀수이므로 eve를 od로 바꾸면 홀수 길이가 됩니다.
  • temp_2를 eve-od로 합계의 차이로 계산합니다.
  • for 루프를 사용하여 arr_2[]를 탐색하고 temp_2가 있는지 확인합니다. 그렇다면 그 전성기. 따라서 1을 반환하고 그렇지 않으면 0을 반환합니다.
  • arr[place][eve][od][temp]가 이미 계산된 경우 -1이 아니므로 반환합니다.
  • temp가 0이 아니면 temp_3=9로 설정합니다. Temp_3은 배치할 수 있는 숫자의 최대 한계입니다. 0이면 vec[place]를 배치하고 그렇지 않으면 숫자가 이미 더 작으므로 아무 숫자나 배치합니다(예:9).
  • 0에서 temp_3까지 숫자를 트래버스합니다. 현재 위치가 홀수이면 set_odd =set_odd + i를 업데이트합니다. ( 이전 홀수 위치 합계 + 현재 숫자 i ).
  • 현재 위치가 짝수이면 set_even =set_even + i를 업데이트합니다. ( 이전 짝수 위치 합계 + 현재 숫자 i ).
  • 세트 개수 +=check(place + 1, set_even, set_odd, set_temp, vec); 반환 arr[place][eve][od][temp] =count.
  • place_prime(int val) 함수는 숫자 val을 사용하여 LSB에서 MSB까지의 숫자를 포함하는 벡터 vec를 생성합니다.
  • 전체 배열을 -1로 설정합니다.
  • 끝에 결과를 반환할 count =check(0, 0, 0, 0, vec)를 취합니다.
  • 결과로 개수를 반환합니다.

예시

#include <bits/stdc++.h>
using namespace std;
const int size = 18;
int arr[size][90][90][2];
//firt 100 prime Numbers
int arr_2[] = {
   2,
   3,
   5,
   7,
   11,
   13,
   17,
   19,
   23,
   29,
   31,
   37,
   43,
   47,
   53,
   59,
   61,
   67,
   71,
   73,
   79,
   83,
   89,
   97
};

int check(int place, int eve, int od, int temp, vector < int > vec) {
   int count;
   int temp_3;
   if (place == vec.size()) {
      if (vec.size() & 1) {
         swap(od, eve);
      }
      int temp_2 = eve - od;
      for (int i = 0; i < 24; i++) {
         if (temp_2 == arr_2[i]) {
            return 1;
         }
      }
      return 0;
   }
   if (arr[place][eve][od][temp] != -1) {
      int set = arr[place][eve][od][temp];
      return set;
   }
   if (temp) {
      temp_3 = 9;
   } else {
      temp_3 = vec[place];
   }
   for (int i = 0; i <= temp_3; i++) {
      int set_temp = temp;
      int set_even = eve;
      int set_odd = od;
      if (i < vec[place]) {
         set_temp = 1;
      }
      if (place & 1) {
         set_odd = set_odd + i;
      } else {
         set_even = set_even + i;
      }
      count += check(place + 1, set_even, set_odd, set_temp, vec);
   }
   return arr[place][eve][od][temp] = count;
}

int place_prime(int val) {
   vector < int > vec;

   while (val) {
      vec.push_back(val % 10);
      val = val / 10;
   }
   reverse(vec.begin(), vec.end());
   memset(arr, -1, sizeof(arr));
   int count = check(0, 0, 0, 0, vec);
   return count;
}
int main() {
   int start = 20, end = 80;
   int count = place_prime(end) - place_prime(start - 1);
   cout << "Count of Numbers in Range with difference between Sum of digits at even and odd positions as Prime are: " << count;
   return 0;
}

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

출력

Count of Numbers in Range with difference between Sum of digits at even and odd positions as Prime are: 15