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。
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.
示例
#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