สมมุติว่าเราได้รับจำนวนเต็มบวกขนาดใหญ่ N เราต้องตรวจสอบว่าเราสามารถหาตัวเลขจากการเรียงสับเปลี่ยนหลักของมันได้หรือไม่ เพื่อให้การเรียงสับเปลี่ยนเท่ากับรูปแบบย้อนกลับ นั่นคือ palindrome และหารด้วย 3 ลงตัวด้วย
ตัวอย่างเช่น สมมติว่าเรามีหมายเลข 132213 หากเราตรวจสอบการเรียงสับเปลี่ยนจากหลักของตัวเลข เราจะได้ 123321 ซึ่งเป็นพาลินโดรมและหารด้วย 3 ลงตัว เราต้องตรวจสอบว่าการเรียงสับเปลี่ยนที่เป็นไปได้จากตัวเลขที่ป้อนเข้าไป เป็นไปตามเงื่อนไขข้างต้น
ดังนั้น หากอินพุตมีลักษณะดังนี้:input_num =132213 ผลลัพธ์จะเป็น "การเรียงสับเปลี่ยนตั้งแต่หนึ่งรายการขึ้นไปเป็นพาลินโดรมและหารด้วยสามลงตัว"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- digit_array :=รายการขนาด 10 ใหม่ที่เริ่มต้นด้วย 0s
- input_sum :=0
- ในขณะที่ input_num ไม่ใช่ศูนย์ ให้ทำ
- input_sum :=input_sum + (input_num mod 10)
- digit_array[input_num mod 10] :=digit_array[input_num mod 10] + 1
- input_num :=ค่าพื้นของ (input_num / 10)
- ถ้า input_sum mod 3 ไม่เหมือนกับ 0 แล้ว
- คืนค่าเท็จ
- index_odd :=0
- สำหรับฉันในช่วง 0 ถึง 9 ทำ
- ถ้า digit_array[i] mod 2 ไม่เหมือนกับ 0 แล้ว
- index_odd :=index_odd + 1
- ถ้า digit_array[i] mod 2 ไม่เหมือนกับ 0 แล้ว
- ถ้า index_odd> 1 แล้ว
- ส่งคืน "ไม่มีการเรียงสับเปลี่ยนเป็นพาลินโดรมและหารด้วยสามลงตัว"
- มิฉะนั้น
- ส่งคืน "การเรียงสับเปลี่ยนตั้งแต่หนึ่งรายการขึ้นไปเป็นพาลินโดรมและหารด้วยสามลงตัว"
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
def solve(input_num): digit_array = [0] * 10 input_sum = 0 while (input_num) : input_sum += input_num % 10 digit_array[input_num % 10] += 1 input_num //= 10 if (input_sum % 3 != 0): return False index_odd = 0 for i in range(10) : if (digit_array[i] % 2 != 0): index_odd += 1 if (index_odd > 1): return "No permutation is a palindrome and is divisible by three" else: return "One or more permutation is a palindrome and is divisible by three" input_num = 132213 print(solve(input_num))
อินพุต
132213
ผลลัพธ์
One or more permutation is a palindrome and is divisible by three