Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ทฤษฎีบทของ Midy ใน C++


เราได้รับค่าจำนวนเต็มเป็น 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