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.

示例

Open Compiler
#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

更新于:2021年10月22日

浏览量:182

开启你的职业生涯

完成课程后获得认证

开始学习
广告