C ++数学答案与课堂不同

时间:2015-03-25 01:51:48

标签: c++ math

我想用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;
}

请我不知道我为此做错了什么。另外,有没有更好的方法来优化它?

2 个答案:

答案 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;
}

Live example