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

C++에서 Midy의 정리

<시간/>

분자를 저장할 a_num과 소수여야 하는 분모를 저장할 p_den으로 정수 값이 제공됩니다. p_den으로 나눈 후 _num에 대해 수행한 연산이 midy's theorem을 증명하는지 확인하는 작업입니다.

미디의 정리를 증명하는 단계는-

  • 분자는 a_num으로, 분모는 p_den으로 입력하며 항상 소수여야 합니다.

  • 숫자를 나눕니다. 반복되는 소수 값을 확인하십시오.

  • 10진수 값이 반복되지 않을 때까지 저장합니다.

  • 숫자가 짝수인지 확인하고 맞으면 반으로 나눕니다.

  • 두 숫자를 모두 더하십시오. 출력이 9의 문자열이면 Midy의 정리를 증명합니다.

이에 대한 다양한 입력 출력 시나리오를 살펴보겠습니다. -

에서 - int a_num =1 및 int p_den =19

밖으로 − 반복 소수점은 다음과 같습니다. 052631578947368421 미디의 정리 증명

설명 − 위에서 언급한 단계에 따라 Midy의 정리, 즉

를 확인합니다.
  • 나누기 1 / 19 =052631578947368421

  • 반복되는 10진수 값은 052631578947368421입니다.

  • 숫자를 반으로 나눕니다(예:052631578 947368421).

  • 두 반쪽을 모두 추가합니다(예:052631578 + 947368421 =999,999,999).

  • 보시다시피 999,999,999는 Midy의 정리를 증명하는 9의 문자열입니다.

에서 -int a_num =49, 정수 p_den =7

밖으로 − 소수점 이하 반복 없음

설명 − 49/7은 49를 7로 완전히 나눌 수 있기 때문에 10진수 값을 생성하지 않는 것을 볼 수 있습니다. 따라서 출력은 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') 및 인쇄는 미디의 정리를 증명했습니다.

  • 그렇지 않으면 Midy의 정리를 적용할 수 없습니다.

  • Midys_theorem(int a_num, int p_den)

    함수 내부
    • 지도 유형 변수를 생성하여 정수 유형 값을 map_val로 매핑하고 지도를 지웁니다.

    • 알림을 a_num % p_den으로 설정합니다.

    • 미리 알림이 0과 같지 않고 map_val.find(reminder)가 map_val.end()와 같은 동안 시작한 다음 map_val[reminder]를 result.length()로 설정하고, 알림을 알림 * 10으로, 임시를 알림 / p_den으로, 결과를 결과 +로 설정합니다. to_string(temp) 및 알림 % p_den에 대한 알림

    • IF 나머지 =0을 확인한 다음 -1 ELSE를 반환하고 카운트를 설정합니다. toresult.substr(map_val[reminder])

    • 반품 횟수

  • 함수 내부 bool check(int val)

    • i가 val/2보다 작아질 때까지 루프 FOR를 i에서 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