我想用c ++练习数学,我尝试用数学课程来编写一个回答这个问题的程序
0< r< 1,找到合理的r值的数量 如果r是最简单的,则分子和分母加上1000 形式
经过一两个小时的调试,我终于得到了一些能够通过所有数字的东西。在课堂上,答案是200.我得到216.为自己跑
#include <math.h>
#include <iostream>
bool rprime_test(int a, int b) {
int tmp = 2;
std::cout << a << "/" << b;
tmp1:
for (tmp; (tmp < a) && (a % tmp != 0); tmp++) {
}
if ((b % tmp == 0 && a % tmp == 0) || b % a == 0) {
std::cout << " == irreduced\n";
return false;
} else if (!tmp < a) {
std::cout << " == reduced\n";
return true;
} else {
//std::cout << tmp << ","<< a << std::endl;
goto tmp1;
}
}
int main() {
int r = 0, a = 1;
int b = 1000 - a;
while (a < b) {
if (rprime_test(a, b)) {
r++;
}
std::cout << "total = " << r << std::endl;
a++;
b = 1000 - a;
//std::cout << "assigned " << a << "/" << b << std::endl;
}
std::cout << "final result = " << r << std::endl;
return 0;
}
请我不知道我为此做错了什么。另外,有没有更好的方法来优化它?
答案 0 :(得分:2)
您的主要问题在于您的rprime_test功能。如果不对现有功能进行过多挖掘,请尝试使用gcd。两个数字a和b是不可简化的分数,当它们是&#34;互质时,&#34;这是他们最大的共同点#34; (gcd)是1.计算两个值的gcd的方式是使用Euclidean Algorithm:
int gcd (int a, int b) {
return b % a == 0 ? a : gcd (b % a, a);
}
你的支票变成了
if (gcd (a, b) == 1) {
a++;
/* etc */
}
答案 1 :(得分:1)
以下作品:
#include <iostream>
int gcd(unsigned int a, unsigned int b)
{
if (b < a) {
return gcd(b, a);
}
int r = a % b;
while (r != 0) {
a = b;
b = r;
r = a % b;
}
return b;
}
int main()
{
int count = 0;
for (int i = 1; i != 500; ++i) {
if (gcd(1000 - i, i) == 1) {
++count;
}
}
std::cout << count << std::endl;
}