GCD相关
板子:
int gcd(int a, int b) { return b > ? gcd(b, a % b) : a; }
POJ1930
题意:给你一个无限循环小数,给到小数点后 9 位,要求这个数的分数形式。
解法:
要想解决这道题,首先应该了解如何将循环小数化为分数:
一,纯循环小数化分数:循环节的数字除以循环节的位数个 9 组成的整数。例如:
$0.3333……=3/9=1/3$;
$0.285714285714……=285714/999999=2/7$.
二,混循环小数:(例如:$0.24333333……$)不循环部分和循环节构成的的数减去不循环部分的差,再除以循环节位数个 9 添上不循环部分的位数个 0。例如:
$0.24333333…………=(243-24)/900=73/300 $
$0.9545454…………=(954-9)/990=945/990=21/22$
这便是循环小数化成分数的方法,知道这个后,解决这道题也好办了。
代码如下:
#pragma GCC optimize(3)
#include <time.h>
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
const double EPS = 1e-;
const int INF = ;
const long long LLINF = ;
const double PI = acos(-1.0); inline int READ() {
char ch;
while ((ch = getchar()) < || < ch)
;
int ans = ch - ;
while ( <= (ch = getchar()) && ch <= )
ans = (ans << ) + (ans << ) + ch - ;
return ans;
} #define REP(i, a, b) for (int i = (a); i <= (b); i++)
#define PER(i, a, b) for (int i = (a); i >= (b); i--)
#define FOREACH(i, t) for (typeof(t.begin()) i = t.begin(); i != t.end(); i++)
#define MP(x, y) make_pair(x, y)
#define PB(x) push_back(x)
#define SET(a) memset(a, -1, sizeof(a))
#define CLR(a) memset(a, 0, sizeof(a))
#define MEM(a, x) memset(a, x, sizeof(a))
#define ALL(x) begin(x), end(x)
#define LL long long
#define Lson (index * 2)
#define Rson (index * 2 + 1)
#define pii pair<int, int>
#define pll pair<LL, LL>
#define MOD ((int)1000000007)
#define MAXN 20 + 5
///**********************************START*********************************///
string ss, sn; char s[MAXN], ns[MAXN];
int nex[MAXN]; void get_next(char* p, int next[]) {
int pLen = strlen(p) + ; //要求循环节长度时这里才+1
next[] = -;
int k = -;
int j = ;
while (j < pLen - ) {
if (k == - || p[j] == p[k]) {
++j;
++k;
if (p[j] != p[k])
next[j] = k;
else
next[j] = next[k];
} else {
k = next[k];
}
}
} int gcd(int a, int b) { return b > ? gcd(b, a % b) : a; } void cal_cal(int len) {
int up = , down = ;
for (int i = len - ; i >= ; i--)
up += int(s[i] - '') * pow(, len - i - );
for (int i = ; i < len; i++) down += * pow(, i);
int g = gcd(up, down);
printf("%d/%d\n", up / g, down / g);
return;
} void cal_cal2(int st, int len) {
char tmp[];
int up = , down = ;
int a, b; for (int i = ; i < st; i++) tmp[i] = s[i];
tmp[st] = '\0';
a = atoi(tmp);
for (int i = st; i < st + len; i++) tmp[i - st] = s[i];
tmp[len] = '\0';
b = atoi(tmp); up = a * pow(, len) + b - a;
int pos = ;
for (int i = ; i < len; i++) tmp[pos++] = '';
for (int i = ; i < st; i++) tmp[pos++] = '';
down = atoi(tmp);
int g = gcd(up, down);
printf("%d/%d\n", up / g, down / g);
return;
} int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif // !ONLINE_JUDGE
while (cin >> ss) {
if (ss.size() == ) break;
int pos = ;
for (int i = ; ss[i] != '.'; i++) s[pos++] = ss[i];
s[pos] = '\0';
int flag = ; // 1为全循环,2为混合循环
get_next(s, nex);
int len = pos - nex[pos];
if (len != pos) {
cal_cal(len);
} else {
int st;
for (st = ; st < pos; st++) {
int nlen = ;
for (int i = st; i < pos; i++) {
ns[nlen++] = s[i];
}
CLR(nex);
get_next(ns, nex);
if (nlen - nex[nlen] != nlen) {
cal_cal2(st, nlen);
break;
} else
continue;
}
}
}
return ;
}
GCD相关的更多相关文章
- CodeForces - 1059C Sequence Transformation (GCD相关)
Let's call the following process a transformation of a sequence of length nn. If the sequence is emp ...
- 4.3 多线程进阶篇<中>(GCD)
更正:队列名称的作用的图中,箭头标注的有些问题,已修正 本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” 本文源码 Demo 详见 Gith ...
- 一些gcd计数问题
数论什么的全都忘光了吧QAQ 做了几道简单的题练习一下. bzoj1101: [POI2007]Zap 求有多少对数满足 gcd(x,y)=d, 1<=x<=a, 1<=y<= ...
- iOS GCD 编程小结
一.简单介绍 1.GCD简介? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD优势 GCD是苹果公司为多核的并行运算提出的 ...
- iOS开发多线程篇—GCD介绍
iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...
- GCD下的几种实现同步的方式
GCD多线程下,实现线程同步的方式有如下几种: 1.串行队列 2.并行队列 3.分组 4.信号量 实例: 去网上获取一张图片并展示在视图上. 实现这个需求,可以拆分成两个任务,一个是去网上获取图片,一 ...
- iOS多线程知识总结--GCD
iOS多线程知识总结--GCD 1. iOS中苹果提供4钟方案来帮助我们实现多线程: (1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用. (2) OC语言的NSTr ...
- ios开发多线程--GCD
引言 虽然GCD使用很广,而且在面试时也经常问与GCD相关的问题,但是我相信深入理解关于GCD知识的人肯定不多,大部分都是人云亦云,只是使用过GCD完成一些很简单的功能.当然,使用GCD完成一些简单的 ...
- IOS 多线程之GCD
参考:http://www.cnblogs.com/wendingding/p/3806821.html <<Objective-C基础教程>> 第二版 一 简介 GCD 全称 ...
随机推荐
- 外网通过frp进行windows远程文件共享
需求 远程访问位于内网中的文件.例如,家里,公司内. 所需技术 frp windows文件共享 具有公网地址的服务器一台 实现过程 windows文件共享,首先自己在局域网内实现.这不是本文重点. 公 ...
- Oracle 数据库 回滚
1.打开Flash存储的权限ALTER TABLE authorization ENABLE row movement ;2.把表还原到指定时间点flashback table authorizati ...
- CAD制图系列之“点”的绘制方法
本章将重点记录点的绘制方法 画直线的原理其实在画两个点,所以,只要会把握点的画法,线就画好啦 点输入模式: 鼠标输入方式: 手动模式: 自动模式: 键盘输入方式: 绝对直角坐标 相对直角坐标 绝对极坐 ...
- shell命令之一天一见:grep
一. 简介 grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来 ...
- Codeforces 1248C Ivan the Fool and the Probability Theory(推公式)
题意 一个n*m的网格图,每个格子可以染黑色.白色,问你每个格子最多有一个相邻颜色相同的方案数 n,m<=1e5 思路 我们先处理\(1 \times m\)的情况 设\(f[i][j]\)为前 ...
- Scala 学习(10)之「集合 」
数组 定长数组 Array:采用()访问,而不是[],下标从 0 开始. val array1 = new Array[String](5) //创建数组 println(array1) //返回数组 ...
- Java程序员必备英文单词
列表中共有769个单词,这些单词是从JDK.Spring.SpringBoot.Mybatis的源码中解析得到,按照在源码中出现的频次依次排列,页面中的单词是出现频次大于1000的.单词的音标.翻译结 ...
- Xamarin.Forms 二维码扫描实践
开发环境: Visual Studio 2019 版本 16.4.5 公用平台nuget ZXing.Net.Mobile.Forms 2.4.1 Plugin.Permissions 5.0.0-b ...
- tar命令详解及使用实例
tar命令 [root@linux ~]# tar [-cxtzjvfpPN] 文件与目录 …. 参数: -c :创建压缩文件 -x :解开压缩文件 -t :查看tar包里面的文件! 上面3个参数只能 ...
- EF core (code first) 通过自动迁移实现多租户数据分离 :按Schema分离数据
前言 本文是多租户系列文章的附加操作文章,如果想查看系列中的其他文章请查看下列文章 主线文章 Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下利用EF ...