C++ 中的米迪定理
給定整數 a_num 儲存分子,p_den 儲存分母(應為質數)。任務是檢查在用 p_den 除 a_num 後對 a_num 執行的操作是否證明了米迪定理。
證明米迪定理的步驟:
輸入分子 a_num 和分母 p_den,分母應始終為質數。
將數字相除。檢查重複的十進位制值。
儲存小數位,直到它們不再重複。
檢查數字是否為偶數,如果是,則將其分成兩半。
將兩個數字相加。如果輸出是 9 的字串,則證明了米迪定理。
讓我們看看各種輸入輸出場景:
輸入 - int a_num = 1 和 int p_den = 19
輸出 - 重複的小數是:052631578947368421 已證明米迪定理
解釋 - 按照上述步驟檢查米迪定理,即:
1 / 19 = 052631578947368421
重複的小數位是:052631578947368421。
將數字分成兩半,即 052631578 和 947368421。
將兩半相加,即 052631578 + 947368421 = 999,999,999。
我們可以看到,999,999,999 是 9 的字串,這證明了米迪定理。
輸入 - int a_num = 49, int p_den = 7
輸出 - 沒有重複的小數
解釋 - 正如我們所看到的,49/7 沒有生成十進位制值,因為 49 可被 7 整除。因此,輸出為“沒有重複的小數”。
下面程式中使用的方案如下:
輸入整數 a_num 和 p_den。
呼叫函式 Midys_theorem(a_num, p_den) 來證明米迪定理。
在函式 check_Midys() 內:
建立變數 int first = 0 和 int last = 0
如果函式 check(val) 返回 FALSE,則列印“米迪定理不適用”。
否則,如果 len % 2 = 0,則從 i = 0 開始迴圈,直到 i 小於 len/2,並將 first 設定為 first * 10 + (str[i] - '0'),last 設定為 last * 10 + (str[len / 2 + i] - '0'),並列印“已證明米迪定理”。
否則,列印“米迪定理不適用”。
在函式 Midys_theorem(int a_num, int p_den) 內:
建立一個 map 型別變數來對映整數型別值,例如 map_val,並清空 map。
設定餘數為 a_num % p_den。
當餘數不等於 0 且 map_val.find(reminder) 等於 map_val.end() 時,設定 map_val[reminder] 為 result.length(),reminder 為 reminder * 10,temp 為 reminder / p_den,result 為 result + to_string(temp),reminder 為 reminder % p_den。
檢查如果餘數 = 0,則返回 -1;否則,設定 count 為 result.substr(map_val[reminder])。
返回 count。
在函式 bool check(int val) 內:
從 i = 2 開始迴圈,直到 i 小於 val/2。檢查如果 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