C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でのミディの定理


分子を格納するa_numと素数であるはずの分母を格納するp_denとして整数値が与えられます。タスクは、p_denで除算した後にa_numで実行された操作が、midyの定理を証明するかどうかを確認することです。

ミディの定理を証明する手順は-

  • 分子をa_numとして、分母をp_denとして入力します。これは、常に主な値である必要があります。

  • 数字を割ります。循環小数の値を確認してください。

  • 繰り返されなくなるまで10進値を保存します。

  • 数字が偶数かどうかを確認し、偶数の場合は半分に分割します

  • 両方の数字を追加します。出力が9の文字列である場合、それはMidyの定理を証明します。

このためのさまざまな入出力シナリオを見てみましょう-

− int a_num=1およびintp_den=19

アウト −循環小数は次のとおりです。052631578947368421証明されたミディの定理

説明 −上記の手順に従って、Midyの定理を確認します。

  • 除算1/19=052631578947368421

  • 循環小数は次のとおりです-:052631578947368421。

  • 数字を半分に分割します(例:052631578947368421)。

  • 両方の半分を追加します。つまり、052631578 + 947368421=999,999,999です。

  • ご覧のとおり、999,999,999は、ミディの定理を証明する9の文字列です。

−int a_num =49、int p_den =7

アウト −循環小数なし

説明 −ご覧のとおり、49は7で完全に割り切れるため、49/7は10進値を生成しません。したがって、出力は循環小数ではありません。

以下のプログラムで使用されているアプローチは次のとおりです

  • inta_numおよびintp_denとして整数値に入力します。

  • 関数をMidys_theorem(a_num、p_den)として呼び出して、Midyの定理を証明します。

  • 関数check_Midys()

    • 変数をintfirstto0およびintlastto0として作成します

    • 関数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に、tempをリマインダー/ p_denに、結果を結果に+ to_string(temp)とリマインダー%p_den。

    • IF剰余=0を確認し、-1 ELSEを返し、カウントをresult.substr(map_val [reminder])

      に設定します。
    • 返品数

  • 関数boolcheck(int val)の内部

    • iからval/2未満になるまで、ループFORを開始します。 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

  1. C++でのラインリフレクション

    2D平面上にn個の点があるとすると、指定された点を対称的に反射するy軸に平行な線があるかどうかを確認する必要があります。つまり、指定された線上にすべての点を反映した後に線が存在するかどうかを確認する必要があります。元のポイントのセットは、反映されたポイントと同じです。 したがって、入力がpoints =[[1,1]、[-1,1]]のような場合 その場合、出力はtrueになります これを解決するには、次の手順に従います- 1つのセットを定義します。 n:=ポイントのサイズ minVal:=inf maxVal:=-inf 初期化i:=0の場合、i <

  2. C++の対角トラバースII

    numsというリストのリストがあるとすると、numsのすべての要素を対角線順に表示する必要があります。 したがって、入力が次のような場合 その場合、出力は[1,6,2,8,7,3,9,4,12,10,5,13,​​11,14,15,16]になります。 これを解決するには、次の手順に従います- 配列retを定義する 1つの2Dアレイvを定義する 初期化i:=0の場合、i