有理数加法+有理数均值+排列枚举

有理数加法

本题要求编写程序,计算两个有理数的和。

输入格式:

输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

输出格式:

在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1:

 1/3 1/6

输出样例1:

1/2

输入样例2:

4/3 2/3

输出样例2:

2

将分子分母通分之后化简即可

#include<bits/stdc++.h>
using namespace std;
int gcdd(int a, int b)
{
    return b ? gcdd(b, a % b) : a;
}//求最大公约数函数(当然也可以用c++ stl 里面的__gcd()函数)
int main() {
    float x1, x2, y1, y2, x3, y3;//x是分子,y是分母
    char ch, sh;//用字符接收输入的/号
    cin >> x1 >> ch >> y1 >> x2 >> sh >> y2;
    x3 = x1 * y2 + x2 * y1;//通分后分子相加
    y3 = y1 * y2;//通分后的分母
    int m = gcdd(x3, y3);//分子分母最大公约数
    x3 /= m;//化简分子
    y3 /= m;//化简分母
    if (fmod(x3, y3) == 0)cout << x3 / y3;//分母为1的情况直接输出分子
    else cout << x3 << '/' << y3;
    return 0;
}

有理数均值

本题要求编写程序,计算N个有理数的平均值。

输入格式:

输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。

输出格式:

在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1:

4
1/2 1/6 3/6 -5/10

输出样例1:

1/6

输入样例2:

2
4/3 2/3

输出样例2:

1

本题是在上一题基础上的进阶,需要将多个有理数先分别化简后再通分相加,如果不随时化简则会溢出

#include<bits/stdc++.h>
using namespace std;
int gcdd(int a, int b)
{
    return b ? gcdd(b, a % b) : a;
}
int main() {
    int n; cin >> n; char ch;
    float x, y;//用x和y存储相加后的和,也表示第一个输入的数
    cin >> x >> ch >> y;
    float g=gcdd(fabs(x),fabs(y));//求分子分母最大公约数,用绝对值是为了将输入时出现的负数转为正数(负数是没有约数这个说法的)
    x/=g,y/=g;//化简
    for (int i = 2; i <= n; i++) {
        float x1, x2, y1, y2;
        char sh;
        cin >> x1 >> sh >> y1 ;//输入第二个数
        float gg=gcdd(fabs(x1),fabs(y1));//求第二个输入数的分子分母最大公约数
        x1/=gg;//化简输入的数
        y1/=gg;
        x2 = x1 * y + x * y1;//相加后通分
        y2 = y1 * y;
        float m = gcdd(fabs(x2), fabs(y2));//求通分后的数的分子分母最大公约数
        x2 /= m;//化简相加后的数
        y2 /= m;
        x = x2;
        y = y2;
  /*      cout << x << '/' << y << endl;*/        //调试用代码
    }
    y *= n;//平均数
    float mm = gcdd(fabs(x), fabs(y));
    x /= mm;//化简平均数
    y /= mm;
    if (fmod(x, y) == 0)cout << x / y;
    else cout << x << '/' << y;
    return 0;
}

 排列枚举

口袋里有红、蓝、黄、黑4种颜色的球若干,每次从口袋先后取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列的情况。球只能是4种颜色之一,而且判断各球是否同色,可以用枚举类型变量处理。

输入格式:

输出格式:

输出所有排列。

输入样例:

在这里给出一组输入。例如:

输出样例:

在这里给出相应的输出。例如:

1 red blue yellow
2 red blue black
3 red yellow blue
4 red yellow black
5 red black blue
6 red black yellow
7 blue red yellow
8 blue red black
9 blue yellow red
10 blue yellow black
11 blue black red
12 blue black yellow
13 yellow red blue
14 yellow red black
15 yellow blue red
16 yellow blue black
17 yellow black red
18 yellow black blue
19 black red blue
20 black red yellow
21 black blue red
22 black blue yellow
23 black yellow red
24 black yellow blue

这里将书上枚举例题的代码做了逻辑上简化处理,易于理解,减少了pri,loop这两个变量,但总体思路没变 

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n = 0;//记录有几种取法
	for (int i = red; i <= black; i++)
		for (int j = red; j <= black; j++)
			if (i != j)
			{
				for (int k = red; k <= black; k++)
					if ((k != i) && (k != j))
					{
						n++;//取法加1
						cout << n;
						switch (i)//判断i是什么颜色的球
						{
						case red:cout << " red"; break;
						case yellow:cout << " yellow"; break;
						case blue:cout << " blue"; break;
						case black:cout << " black"; break;
						}
						switch (j)//判断j是什么颜色的球
						{
						case red:cout << " red"; break;
						case yellow:cout << " yellow"; break;
						case blue:cout << " blue"; break;
						case black:cout << " black"; break;
						}
						switch (k)//判断k是什么颜色的球
						{
						case red:cout << " red"; break;
						case yellow:cout << " yellow"; break;
						case blue:cout << " blue"; break;
						case black:cout << " black"; break;
						}
						cout << endl;
					}
			}

	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值