เราได้รับค่าจำนวนเต็มเป็น a_num ที่จะเก็บตัวเศษและ p_den ที่จะเก็บตัวส่วนซึ่งควรเป็นจำนวนเฉพาะ งานคือตรวจสอบว่าการดำเนินการที่ทำใน a_num หลังจากหารด้วย p_den พิสูจน์ทฤษฎีบทของ midy หรือไม่
ขั้นตอนในการพิสูจน์ทฤษฎีบทของ Midy คือ-
-
ป้อนตัวเศษเป็น a_num และตัวส่วนเป็น p_den ซึ่งควรเป็นค่าเฉพาะเสมอ
-
แบ่งเลข. ตรวจสอบค่าทศนิยมซ้ำ
-
เก็บค่าทศนิยมไว้จนกว่าจะไม่ซ้ำ
-
ตรวจสอบว่าตัวเลขเป็นเลขคู่หรือไม่ ถ้าใช่ ให้แบ่งครึ่ง
-
เพิ่มทั้งสองตัวเลข หากผลลัพธ์เป็นสตริงของ 9 ก็จะพิสูจน์ทฤษฎีบทของ Midy
ให้เราดูสถานการณ์อินพุตเอาต์พุตต่างๆ สำหรับสิ่งนี้ -
ใน − int a_num =1 และ int p_den =19
ออก − ทศนิยมซ้ำคือ:052631578947368421 พิสูจน์ทฤษฎีบทของ Midy
คำอธิบาย − ทำตามขั้นตอนด้านบนเพื่อตรวจสอบทฤษฎีบทของ Midy เช่น
-
หาร 1 / 19 =052631578947368421
-
ค่าทศนิยมซ้ำคือ-:052631578947368421
-
แบ่งตัวเลขออกเป็นครึ่งๆ เช่น 052631578 947368421
-
เพิ่มทั้งสองส่วน เช่น 052631578 + 947368421 =999,999,999
-
ดังที่เราเห็น 999,999,999 เป็นสตริงของ 9 ซึ่งพิสูจน์ทฤษฎีบทของ Midy
ใน −int a_num =49, int p_den =7
ออก − ไม่มีทศนิยมซ้ำ
คำอธิบาย − ดังที่เราเห็น 49/7 ไม่สร้างค่าทศนิยมเนื่องจาก 49 หารด้วย 7 ลงตัวทั้งหมด ดังนั้น ผลลัพธ์จึงเป็น No Repeating Decimal
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
-
ป้อนค่าจำนวนเต็มเป็น int a_num และ int p_den
-
เรียกใช้ฟังก์ชันเป็น Midys_theorem(a_num, p_den) เพื่อพิสูจน์ทฤษฎีบทของ Midy
-
ภายในฟังก์ชัน check_Midys()
-
สร้างตัวแปรเป็น int ก่อนถึง 0 และ int สุดท้ายเป็น 0
-
ตรวจสอบว่าฟังก์ชัน check(val) คืนค่า FALSE หรือไม่ จากนั้นพิมพ์ทฤษฎีบทของ Midy ว่าใช้ไม่ได้
-
ELSE IF len % 2 =0 ให้เริ่มวนลูป FOR จาก i ถึง 0 จนถึง i น้อยกว่า len/2 และตั้งค่าก่อนเป็นอันดับแรก * 10 + (str[i] - '0') และอยู่ท้ายสุด * 10 + (str[ len / 2 + i] - '0') และ print พิสูจน์ทฤษฎีบทของ Midy
-
-
มิฉะนั้น พิมพ์ทฤษฎีบทของ Midy ใช้ไม่ได้
-
ภายในฟังก์ชัน Midys_theorem(int a_num, int p_den)
-
สร้างตัวแปรประเภทแผนที่เพื่อจับคู่ค่าประเภทจำนวนเต็มเป็น map_val และล้างแผนที่
-
ตั้งการเตือนเป็น a_num % p_den.
-
เริ่มในขณะที่ตัวเตือนไม่เท่ากับ 0 และ map_val.find(เตือนความจำ) เท่ากับ map_val.end() จากนั้นตั้งค่า map_val[เตือนความจำ] เป็น result.length() เตือนความจำ * 10 ชั่วคราวเพื่อเตือนความจำ / p_den ผลลัพธ์เป็นผลลัพธ์ + to_string(ชั่วคราว) และตัวเตือนความจำ % p_den.
-
ตรวจสอบว่าส่วนที่เหลือ =0 แล้วคืนค่า -1 ELSE ตั้งค่าการนับ toresult.substr(map_val[เตือนความจำ])
-
จำนวนคืน
-
-
ภายในฟังก์ชันตรวจสอบบูล (int val)
-
เริ่มวนรอบ FOR จาก i ถึง 2 จนถึง i น้อยกว่า val/2 ตรวจสอบ IF val % i =0 แล้วคืนค่า FALSE ไม่เช่นนั้นให้คืนค่า TRUE
-
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; bool check(int val){ for(int i = 2; i <= val / 2; i++){ if(val % i == 0){ return false; } } return true; } void check_Midys(string str, int val){ int len = str.length(); int first = 0; int last = 0; if(!check(val)){ cout<<"\nNot applicable for Midy's theorem"; } else if(len % 2 == 0){ for(int i = 0; i < len / 2; i++){ first = first * 10 + (str[i] - '0'); last = last * 10 + (str[len / 2 + i] - '0'); } cout<<"\nProved Midy's theorem"; } else{ cout<<"\nNot applicable for Midy's theorem"; } } string Midys_theorem(int a_num, int p_den){ string result; map<int, int> map_val; map_val.clear(); int reminder = a_num % p_den; while((reminder != 0) && (map_val.find(reminder) == map_val.end())){ map_val[reminder] = result.length(); reminder = reminder * 10; int temp = reminder / p_den; result += to_string(temp); reminder = reminder % p_den; } if(reminder == 0){ return "-1"; } else{ string count = result.substr(map_val[reminder]); return count; } } int main(){ int a_num = 1; int p_den = 19; string result = Midys_theorem(a_num, p_den); if(result == "-1"){ cout<<"No Repeating Decimal"; } else{ cout<<"Repeating decimals are: "<<result; check_Midys(result, p_den); } return 0; }
ผลลัพธ์
หากเรารันโค้ดด้านบน มันจะสร้างผลลัพธ์ต่อไปนี้
Repeating decimals are: 052631578947368421 Proved Midy's theorem