第九届蓝桥杯大赛个人赛省赛(软件类)真题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;
}
相关推荐
大锦终2 小时前
【C++】红黑树
c语言·开发语言·数据结构·c++
似水এ᭄往昔2 小时前
【数据结构】——栈
c语言·数据结构
jz_ddk2 小时前
[学习]RTKLib详解:rtksvr.c与streamsvr.c
c语言·学习·github
一尘之中2 小时前
二进制与十六进制数据转换:原理、实现与应用
linux·c语言·人工智能
mmz12073 小时前
后缀表达式+栈(详解)(c++)
c语言·c++
努力努力再努力wz3 小时前
【Linux实践系列】:进程间通信:万字详解共享内存实现通信
java·linux·c语言·开发语言·c++
weixin_428498493 小时前
C/C++工程中的Plugin机制设计与Python实现
c语言·c++·python
智者知已应修善业3 小时前
【验证哥德巴赫猜想(奇数)】2021-11-19 15:54
c语言·c++·经验分享·笔记·算法
玩转数据库管理工具FOR DBLENS5 小时前
项目高压生存指南:科学重构身体与认知系统的抗压算法
大数据·数据库·职场和发展·项目管理
WAR|CRANE6 小时前
操作系统面试问题(4)
面试·职场和发展