计蒜客信息学入门赛 #21约分(逐句精解)

如果一个分数的分子小于分母,我们称之为 真分数,反之则为 假分数。

蒜头君只认识真分数和整数,请你将题目当中给出的分数进行处理:


在这里插入图片描述

输入格式
输入共一行,为两个空格隔开的整数a,b (1≤a,b≤200),表示该分数的分子和分母;

输出格式
输出共一行,为 11 个,22 个空格隔开的或33 个空格隔开的整数,对应处理完成的整数,真分数的分子、分母,或带分数的整数部分、分子、分母。

数据规模与约定

测试点编号 a, b
1-2 a < b
3-5 a >= b且 a %b = 0
6-10 a >= b且 a % b != 0,需要约分

输出时每行末尾的多余空格,不影响答案正确性

样例输入1
2 5
样例输出1
2 5
样例解释1
真分数,不做处理直接输出,分子分母互质

样例输入2
120 100
样例输出2
1 1 5
样例解释2
需要转换为带分数,并约分。
在这里插入图片描述

1、定义头文件

#include 
#include 

2、定义数据

vector<int> dd;
bool f;

3、得到200以内的质数

一会要判断是否要约分用了

void d() {
    for (int i = 2; i <= 200; i++) {
        f = true;
        for (int j = 2; j * j <= i; j++) {
            if (i % j == 0) {
                f = false;
                break;
            }
        }
        if (f) {
            dd.push_back(i);
        }
    }
}

4、数据输入


int main() {
    d();
    int len = dd.size();
    int a, b;
    int x = 0, y = 0, z = 0;
    cin >> a >> b;
   
}

5、真分数数据处理

当为真分数的时候

if (a < b) {
    for (int i = 0; i < len; i++) {
        if (a % dd[i] == 0 && b % dd[i] == 0) {	用质数除
        	a = a / dd[i];
        	b = b / dd[i];
            i--;			要是能的话再回去再除
        }
    }
    cout << a << " " << b;
    return 0;
}

6、可化简为整数的数据处理

当为可化简为整数的时候

if (a == b) {
    cout << 1;	直接输出1
    return 0;
}
if (a % b == 0) {
    cout << a / b;	直接输出整数
    return 0;
}

7、假分数数据处理


int cc = a / b;		算出前面的数字
cout << cc << " ";
a = a - cc * b;		化为真分数
for (int i = 0; i < len; i++) {
    if (a % dd[i] == 0 && b % dd[i] == 0) {	用质数除
        a = a / dd[i];
        b = b / dd[i];
        i--;		要是能的话再回去再除
    }
}
cout << a << " " << b;

8、return 0

return 0;

完整代码

#include 
#include 

using namespace std;
vector<int> dd;
bool f;
void d() {
    for (int i = 2; i <= 200; i++) {
        f = true;
        for (int j = 2; j * j <= i; j++) {
            if (i % j == 0) {
                f = false;
                break;
            }
        }
        if (f) {
            dd.push_back(i);
        }
    }
}


int main() {
    d();
    int len = dd.size();
    int a, b;
    int x = 0, y = 0, z = 0;
    cin >> a >> b;
    if (a < b) {
        for (int i = 0; i < len; i++) {
            if (a % dd[i] == 0 && b % dd[i] == 0) {
            a = a / dd[i];
            b = b / dd[i];
                i--;
            }
        }
        cout << a << " " << b;
        return 0;
    }
    if (a == b) {
        cout << 1;
        return 0;
    }
    if (a % b == 0) {
        cout << a / b;
        return 0;
    }
    int cc = a / b;
    cout << cc << " ";
    a = a - cc * b;
    for (int i = 0; i < len; i++) {
        if (a % dd[i] == 0 && b % dd[i] == 0) {
            a = a / dd[i];
            b = b / dd[i];
            i--;
        }
    }
    cout << a << " " << b;
    return 0;
}

你可能感兴趣的:(算法,极致通俗,算法,c++,字符串,链表)