第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-分数

solution1

直观上的分数处理

cpp 复制代码
#include <iostream>
using namespace std;
int main()
{
  printf("1048575/524288");
  return 0;
}
cpp 复制代码
#include<stdio.h>
#include<math.h>
typedef long long ll;
struct fraction{
	ll up, down;
};
ll gcd(ll a, ll b){
	if(!b) return a;
	return gcd(b, a % b);
}
fraction r(fraction f){
	if(gcd(f.down, f.up) > 1){
		f.down /= gcd(f.down, f.up);
		f.up /= gcd(f.down, f.up);
	}
	return f;
}
fraction add(fraction f1, fraction f2){
	fraction f;
	f.down = f1.down * f2.down;
	f.up = f1.up * f2.down + f2.up * f1.down;
	return r(f);
}
int main(){
	fraction f, t;
	f.up = f.down = 1;
	for(ll i = 2; i <= pow(2, 19); i *= 2){
		t.up = 1;
		t.down = i;
		printf("%lld %lld\n", t.down, f.up);
		f = add(f, t);
	}
	printf("%lld %lld, %lld %lld", f.up / f.down, f.up % f.down, f.up, f.down);
	return 0;
}

solution2

手动通分计算为

(219+218+217......+20)/219= (220-1)/219

  • 20+21+22+......+2n-1 = 2n-1
  • 较大的数若比 较小的数 的两倍大于或者小1,则两者互质
cpp 复制代码
#include<stdio.h>
#include<math.h>
typedef long long ll;
int main(){
	printf("%lld/%lld", (ll) pow(2, 20) - 1, (ll) pow(2, 19));//注意别漏了强转double -> ll
	return 0;
}
相关推荐
Re.不晚10 小时前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
2601_9555181810 小时前
C语言标准演化史:从K&R到GNU,谁才是正统?
c语言·gnu·标准演化·ansic·性能与可移植性
程序员zgh11 小时前
C++ 拷贝赋值运算符 详解
c语言·开发语言·c++
小婷一直在努力13 小时前
自定义类型:联合和枚举
c语言·联合和枚举
夕阳23013 小时前
做耳机开发,需要掌握哪些 C 语言知识?
c语言·开发语言·#蓝牙开发·#蓝牙技术
weixin_4568083813 小时前
【沁恒蓝牙开发】BLE常见错误码与解析
c语言·单片机·嵌入式硬件
HJX_072414 小时前
嵌入式软件C语言八股文复习笔记5——编译、链接与底层硬核机制
c语言·开发语言·笔记
haolin123.15 小时前
类和对象(下)
c语言·开发语言·c++
(Charon)17 小时前
【C++】手写 MySQL 连接池(三):异步任务队列与工作线程
c语言·c++
加油码18 小时前
共享内存详解:原理、系统调用与高性能进程间通信
linux·c语言·c++