求分数的和与差

介绍:

给四个整数,从第一个开始,每两个数为一个分数,前面的为分子后面的为分母,求两个分数的和与差,如果结果为整数就输出整数,如果不是整数,那就输出最简分数

思考:

1.就用解数学题的方式来做,将两个分数的分母化成相同的数,然后计算分子
2.算出结果之后,要求最简的分数,直接同时除以分子和分母的最大公约数就行了。
package 初级;

import java.util.Scanner;

/*
 * 介绍:
 *      依次给四个整数,每两个为一个分数。求他们的和和差
 */
public class 分数的加减 {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int a = input.nextInt();
        int b = input.nextInt();
        int c = input.nextInt();
        int d = input.nextInt();
        add(a,b,c,d);
        subtract(a,b,c,d);
    }

    private static void subtract(int a, int b, int c, int d) {
        if((a*d-b*c)%(b*d) == 0){//当能够整除的话
            int result = (a*d-b*c)/(b*d);
            System.out.println(a+"/"+b+"-"+c+"/"+d+" = "+result);
        }else{
            int fenzi = (a*d-b*c);
            int fenmu = (b*d);
            int max = getMax(fenzi,fenmu);
            fenzi = fenzi / max;
            fenmu = fenmu / max;
            System.out.println(a+"/"+b+"-"+c+"/"+d+" = "+ fenzi +"/"+ fenmu);
        }
    }

    private static void add(int a, int b, int c, int d) {
            if((a*d+b*c)%(b*d) == 0){//当能够整除的话
                int result = (a*d+b*c)/(b*d);
                System.out.println(a+"/"+b+"+"+c+"/"+d+" = "+result);
            }else{//不能整除,则显示为分数,并且要化到最简
                int fenzi = (a*d+b*c);
                int fenmu = (b*d);
                int max = getMax(fenzi,fenmu);//求两个数的最大公约数,就可以直接得到最简式
                fenzi = fenzi / max;
                fenmu = fenmu / max;
                System.out.println(a+"/"+b+"+"+c+"/"+d+" = "+ fenzi +"/"+ fenmu);
            }
    }
    //得到最大公约数
    private static int getMax(int x, int y) {
        int temp,a,b;
        if(x<y){//当x<y时,将x、y换位置。使x>y,因为求最大公约数是取余,前面的数要比后面的大
            temp = y;
            y = x;
            x = temp;
        }
        a = x;
        b = y;
        while(b!=0){
            //第一次判断的时候,如果b==0,那么说明最大公约数就是0;
            //第一次过后,b就代表的是余数了,余数如果不为0,说明还没有整除,需要一直循环,直到能够整除。
            //当b==0时,上一个b的值赋值给了a。所以最大公约数现在是a。
            temp = a%b;
            a = b;
            b = temp;
        }
        return a;
    }
}
### Python 中分数前缀的概念及实现 #### 分数组概念 分数组是一种用于高效处理区间更新的数据结构。通过构建一个原数组长度相同的分数组 `diff`,其中 `diff[i]` 存储的是 `nums[i] - nums[i-1]` 的结果(对于第一个元素,则直接等于 `nums[0]`)。这种表示方法使得可以在常数时间内完成区间的增量操作[^2]。 ```python def build_diff_array(nums): """ 构建分数组 """ if not nums: return [] diff = [0] * len(nums) diff[0] = nums[0] for i in range(1, len(nums)): diff[i] = nums[i] - nums[i - 1] return diff ``` 当需要对某个区间 `[l, r]` 进行增加或减少相同数值的操作时,在分数组上只需修改两个位置即可达到目的: - 对于左端点 `l` 处加增加值; - 右端点之后的第一个位置即 `r+1` 减去该值; 最后再通过对分数累加得到新的原始数组状态。 ```python def apply_increment(diff, l, r, val): """ 应用增量至指定范围内的分数组 """ diff[l] += val if r + 1 < len(diff): diff[r + 1] -= val def reconstruct_from_diff(diff): """ 根据分数组重构原始数组 """ res = [0] * len(diff) res[0] = diff[0] for i in range(1, len(diff)): res[i] = res[i - 1] + diff[i] return res ``` #### 前缀概念 前缀是指给定序列中从起始位置到当前位置所有元素之所组成的另一个序列。利用预先计算好的前缀表,可以迅速获取任意子数组的总而无需重复遍历整个列表中的每一个元素[^3]。 ```python n = 10 a = list(range(n + 1)) # 初始化数组 a=[0, 1, ..., n] prefix_sum = [0] * (n + 1) for i in range(1, n + 1): prefix_sum[i] = prefix_sum[i - 1] + a[i] print(prefix_sum) # 输出前缀数组 ``` 为了查询某一段连续区域 `[i,j]` 内部所有项相加之,只需要做一次减法运算就可以得出结果: \[ \text{sum}(i:j)=\text{prefix\_sum}[j]-\text{prefix\_sum}[i-1]\][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值