首页 > 其他分享 >建民打卡日记5.5

建民打卡日记5.5

时间:2023-05-05 19:12:40浏览次数:40  
标签:return 5.5 int sum2 sum1 else 打卡 建民 gcd

一、问题描述

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

二、流程设计

实际上本题考察分数相加:即分母通分,分子相加,约分。   最大公约数 gcd(),使用递归的方式实现辗转相除法求最大公约数。   return b ? gcd(b, a % b) : a;   输出的时候注意考虑所有情况: 设结果为n,则① n > 1;② n = 1;③ n < 1;

三、代码实现

#include <bits/stdc++.h>
using namespace std;

int gcd(int a, int b) {
	if (b == 0)
		return a;
	else
		return gcd(b, a % b);
}

int min_gb(int n, int m) {
	return n * m / gcd(n, m);
}

int main() {
	int n;
	cin >> n;
	int sum1 = 0;
	int sum2 = 0;
	for (int i = 0; i < n; i++) {
		if (i != 0) {
			int a, b;
			scanf("%d/%d", &a, &b);
			int k = min_gb(sum2, b);
			int j = gcd(sum2, b);
			sum1 = sum1 * (k / sum2) + a * (k / b);
			sum2 = k;
		} else {
			int a, b;
			scanf("%d/%d", &a, &b);
			sum1 += a;
			sum2 += b;
		}
	}
	int b = gcd(sum1, sum2);
	if (sum1 == 0)
		cout << "0";
	else {
		if (b != 1 && sum1 > 0) {
			sum1 /= b;
			sum2 /= b;
		} else {
			sum1 = sum1 / b * -1;
			sum2 = sum2 / b * -1;
		}
		if (sum1 < sum2) {
			cout << sum1 << "/" << sum2 << endl;
		} else if (sum1 % sum2 == 0) {
			cout << sum1 / sum2 << endl;
		} else
			cout << sum1 / sum2 << " " << sum1 % sum2 << "/" << sum2 << endl;
	}
}

 

标签:return,5.5,int,sum2,sum1,else,打卡,建民,gcd
From: https://www.cnblogs.com/cor0000/p/17372304.html

相关文章

  • 每日总结 5.5
    今天学习了HTML页面的刷新。<ahref="javascript:location.reload();">点击重新载入页面</a><ahref="javascript:history.go(0);">点击重新载入页面</a><ahref="javascript:location=location;">点击重新载入页面</a><ahref="j......
  • 每日打卡一小时(第十九天)(空)未完
    一.问题描述6-3【CPP0024】设计并实现大数类BigNum定义一个整数型大数类,要求能够完成100位以内的较大整数的加法和减法计算,main(void)函数完成对其的测试。BigNum类结构说明: BigNum类的数据成员包括:①私有数据成员:数值域num(char[]型)。BigNum类成员函数包括:①有参构造......
  • 5.5
    #include<stdio.h>main(){longn,sum,i;while(scanf("%ld",&n)!=EOF){printf("在1-%ld之间的阶梯数为:\n",n);sum=0;for(i=7;i<=n;i++)if(i%7==0)if(i%6==5)if(i%5==4)if(i%3==2){sum++;printf("%ld\n",i);}printf("在1-%ld之间,有%ld个......
  • 天天打卡一小时第十天
    天天打卡一小时第十天问题描述实验2-5念数字输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:0:ling1:yi2:er3:san4:si5:wu6:liu7:qi8:ba9:jiu输入格式:输入在一行中给出一个整数,如:1234。提示:整数包括负数、零和正数。输出格式:在......
  • 2023.5.5 面向对象程序设计实验报告
    实验项目名称:模板一、实验目的1、熟练掌握函数模板和类模板的定义格式。2、熟练运用函数模板和类模板解决实际问题。二、实验内容1、复数类Complex有两个数据成员:a和b,分别代表复数的实部和虚部,并有若干构造函数和一个重载-(减号,用于计算两个复数的距离)的成员函数。要求设计......
  • 打卡17
    3.4回文数方法1:这个数据范围是很小的了,即便是从1遍历到256*256然后再判段每个数的位数才256*256*5时间复杂度,很小的也就6*10^6左右,然后判断前后是否对称即可;方法2:这是比较简单的方法,从1-256平方,然后判断每个数是否对称即可,不会爆int。#include<bits/stdc++.h>usingnamespace......
  • 5.4打卡
     template<classT>classMyArray{private:intsize;T*data;public:MyArray(ints){size=s;data=newT[size];}voidsort(){inti,j,min;Tt;for(i=0;i<size;i++)cin>>data[i];for(i=0;i<size-1;i++)......
  • 5.5打卡
     template<classT>voidsort(T*a,intsize){for(inti=0;i<size;i++){cin>>a[i];}for(inti=0;i<size;i++){intmin=i;for(intj=i+1;j<size;j++){if(a[min]>......
  • 打卡 有序数组(类模板)
    实现一个类模板,它可以接受一组数据,能对数据排序,也能输出数组的内容。每行输入的第一个数字为0,1,2或3:为0时表示输入结束;为1时表示将输入整数,为2时表示将输入有一位小数的浮点数,为3时表示输入字符。如果第一个数字非0,则接下来将输入一个正整数,表示即将输入的数据的数量。从每行......
  • 编程打卡: C++ 语言程序设计
    #include<iostream>usingnamespacestd;classComplex{protected:doublereal;doubleimag;public:Complex(doubler=0.0,doublei=0.0):real(r),imag(i){};Complexoperator+(constComplex&c){......