กำหนดตัวเลขสองตัวเริ่มต้นและสิ้นสุดเป็นตัวแปรช่วง เป้าหมายคือการหาจำนวนตัวเลขที่อยู่ในช่วงนี้ [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[size][90][90][2] นี่คือขนาดกำลังของ 10 ดังนั้นจำนวนที่มากที่สุดที่อินพุตจะเป็น 10 ขนาด .
ในแต่ละการเรียกซ้ำเพื่อตรวจสอบฟังก์ชัน (int place, int eve, int od, int temp, vector
ใน arr[size][x][y][temp], x คือผลรวมของหลักในตำแหน่งคู่ที่วางไม่เกิน x และ y สำหรับผลรวมของหลักคี่ที่วางไม่เกิน y ตรวจสอบว่าความแตกต่างที่ต้องการคือจำนวนเฉพาะหรือไม่ใช้อาร์เรย์ arr_2[] ซึ่งเก็บจำนวนเฉพาะทั้งหมดไม่เกิน 100 ตามลำดับ
- รับตัวแปรเริ่มต้นและสิ้นสุดเป็นอินพุต
- ใช้อาร์เรย์โกลบอล arr[size][90][90][2] และอาร์เรย์ arr_2[] สำหรับจำนวนเฉพาะสูงสุด 100
- การตรวจสอบฟังก์ชัน (int place, int eve, int od, int temp, vector
vec) รับตำแหน่งปัจจุบันของหลักเป็นสถานที่, ผลรวมปัจจุบันของตำแหน่ง eve ตำแหน่งเป็นคู่และตำแหน่งคี่เป็น od, ค่าของ temp และเวกเตอร์ vec ที่มีตัวเลข - มันเติมค่าที่ arr[place][eve][od][temp] แบบเรียกซ้ำ
- นำค่าเริ่มต้นสำหรับองค์ประกอบปัจจุบันเป็น count=0
- สำหรับตำแหน่งปัจจุบัน ตรวจสอบว่าสถานที่นั้นเป็นตำแหน่งสุดท้ายโดยใช้ if(place ==vec.size()) ถ้าใช่ ให้ตรวจสอบว่าตำแหน่งนั้นเป็นคี่หรือคู่
- if(vec.size() &1) ให้ผลลัพธ์เป็นจริง ตำแหน่งปัจจุบันจะเป็นคี่ ดังนั้นให้สลับอีฟกับ od เนื่องจากเป็นตัวเลขความยาวคี่
- คำนวณ temp_2 เป็นผลต่างของผลรวมในวันก่อนหน้า
- ใช้ for loop ข้าม arr_2[] และตรวจสอบว่าพบ temp_2 หรือไม่ ถ้าใช่ แสดงว่าเป็นไพรม์ ดังนั้นให้คืนค่า 1 อย่างอื่นคืนค่า 0
- ถ้า arr[place][eve][od][temp] ได้รับการคำนวณแล้ว มันจะไม่เป็น -1 ดังนั้นให้ส่งคืน
- ถ้า temp ไม่ใช่ศูนย์ ให้ตั้งค่า temp_3=9 Temp_3 คือขีดจำกัดสูงสุดของตัวเลขที่เราวางได้ หากเป็น 0 ให้วาง vec[place] มิฉะนั้น ตัวเลขจะน้อยกว่าอยู่แล้ว ดังนั้นให้วางหลักใดๆ ว่า 9
- ข้ามหลักจาก 0 ถึง temp_3. หากตำแหน่งปัจจุบันเป็นเลขคี่ ให้อัปเดต set_odd =set_odd + i; (ผลรวมตำแหน่งคี่ก่อนหน้า + ตัวเลขปัจจุบัน i )
- หากตำแหน่งปัจจุบันเป็นคู่ ให้อัปเดต set_even =set_even + i; (ผลรวมตำแหน่งคู่ก่อนหน้า + ตัวเลขปัจจุบัน i )
- ตั้งค่าการนับ +=ตรวจสอบ (สถานที่ + 1, set_even, set_odd, set_temp, vec); และส่งคืน arr[place][eve][od][temp] =count.
- Function place_prime(int val) ใช้ค่าตัวเลขและสร้างเวกเตอร์ vec ที่มีตัวเลขจาก LSB ถึง MSB
- ตั้งค่าอาร์เรย์ทั้งหมด arr[][][][] ด้วย -1.
- Take count =ตรวจสอบ (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