假如从1至100,我想选择23至48, 56 ,78, 90,这些数字,应该怎么写?
用C++字符串分割,给你个思路
,
分割字符串“23-48,56,78,90”,分解的结果存在字符数组里-
,那么就生成从23到48的所有数字,否则就只生成一个数字1. 分数的定义
定义一个结构体,内含分母和分子两个整型元素。
struct F{
int up, down;
};
2. 特殊情况的规定
当分数为负分数时,我们规定分子为负数,分母为正数。也就是说,当分母为负时,对分子分母同时取反。
当分数为 0 时,我们规定分子为 1,分母为 0。
当分数不是最简式时,求出分子分母的最大公约数d,将分子分母同时除以d得到最简分式。具体步骤见下一节“分数的化简”。
当分数为假分数时(即分子大于分母),
F reduction(int up, int down){
int d = 1;
F result;
// 分母小于 0,分子分母同时取反
if(down < 0){
up = -up;
down = -down;
}
// 分式等于 0,使分母为 1
if(up == 0){
down = 1;
}else{
// 求出分子分母的最大公约数
if(up > down){
d = gcd(up, down);
}else{
d = gcd(down, up);
}
}
// 将分子分母除以他们的最大公约数,得到最简分式
result.up = up / d, result.down = down / d;
return result;
}
4. 分式的四则运算
这个其实很简单,只需要模拟我们平时生活中计算分式的方法即可。需要注意一点是两个分式计算完毕之后需要化简为最简分式。这里我只实现两个分式的加运算,其余三个懒不想写可以留作练习。
F add(F a, F b){
// 设两个分式 A = a/b 和 B = c/d,那么
// A + B = (a * d + b * c) / b * d
// 也就是先通分,然后分子相加,注意这一步我们把计算结果化为最简分式了
return reduction(a.up * b.down + b.up * a.down, a.down * b.down);
}
5. 分式的输出
需要分以下几种情况讨论:
分母为一,也就是为整数的情况,一般只需要输出分子
假分数(分子大于分母),多出来的一部分整数为分子/分母,原分式的分子变为 abs(分子 % 分母),分母不变
真分数,直接输出即可
看代码:
void print_fraction(F f){
if(f.down == 1){ // 整数
printf("%d\n", f.up);
}else if(f.up > f.down){ // 假分数
printf("%d %d/%d\n", f.up / f.down, abs(f.up % f.down), f.down);
}else{ // 真分数
printf("%d/%d\n", f.up, f.down);
}
}
总结
表示分数的思想很简单,就是模拟现实生活中的分数表示方法。
#include <cstdio>
#include <cmath>
using namespace std;
struct Fraction{
int up, down;
};
int gcd(int a, int b){
return !b ? a : gcd(b, a % b);
}
Fraction get_fraction(int up, int down){
int d = 1;
Fraction res;
if(down < 0){
down = -down;
up = - up;
}
if(up == 0){
down = 1;
}else{
if(up > down){
d = gcd(up, down);
}else{
d = gcd(down, up);
}
}
res.up = up / d, res.down = down / d;
return res;
}
Fraction add(Fraction a, Fraction b){
return get_fraction(a.up * b.down + b.up * a.down, a.down * b.down);
}
Fraction sub(Fraction a, Fraction b){
return get_fraction(a.up * b.down - b.up * a.down, a.down * b.down);
}
Fraction mul(Fraction a, Fraction b){
return get_fraction(a.up * b.up, a.down * b.down);
}
Fraction div(Fraction a, Fraction b){
return get_fraction(a.up * b.down, a.down * b.up);
}
void prt_fraction(Fraction f){
if(f.down == 1){
printf("%d\n", f.up);
}else if(f.up > f.down){
printf("%d %d/%d\n", f.up / f.down, abs(f.up % f.down), f.down);
}else{
printf("%d/%d\n", f.up, f.down);
}
}
int main(){
Fraction a, b;
a = get_fraction(12, 24), b= get_fraction(5, 12);
prt_fraction(add(a, b));
prt_fraction(sub(a, b));
prt_fraction(mul(a, b));
prt_fraction(div(a, b));
return 0;
}