ZZUOJ - 1081 - 三进制小数

1081: 三进制小数

Time Limit: 2 Sec  Memory Limit: 128 MB

Submit: 60  Solved: 22

[Submit][Status][Web
Board
]

Description

你的任务呢,是将一个有理数转换成三进制小数。“什么是三进制小数呢?”你一定会问,这很明白,就是以三为基(二进制数以2为基,而十进制数则以10为基)的小数。

Input

有理数的值都是在0与1之间的,每个有理数都由一个分子和一个分母表示,分子与分母之间隔着一个斜杠。有理数的个数不会超过1000个。

Output

输出格式见样本输出,它是以小数点开头的具有10位精度的3进制数。

Sample Input

1/3

1/4

1/6

7/8

Sample Output

.1000000000

.0202020202

.0111111111

.2121212122

HINT

Source

唉,一个简单题也WA两次,我发现我越来越不行了。。

思路:就是乘三取整,不过注意最后一位可能要进位

还要注意浮点数陷进,今天调用库函数已经错了两个题了,哭%>_<%啊!

AC代码:

/*************************************************************************
    > File Name: c.cpp
    > Author: zzuspy
    > Mail: [email protected]
    > Created Time: 2014年12月03日 星期三 15时24分26秒
 ************************************************************************/

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#define LL long long
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
using namespace std;

const double n = 0.0000001;

int main()
{
    int a, b;
    while(scanf("%d/%d", &a, &b)!=EOF)
    {
        double num = (double)a/b;
        printf(".");
        for(int i=0; i<9; i++)
        {
            num*=3;
            printf("%d", (int)floor(num+n));
            num-=floor(num+n);
        }
        num*=3;
        int ans = (int)floor(num+n);
        num-=floor(num+n);
        if(floor(num*3+n)>=2 && ans<=1)printf("%d\n", ans+1);
        else printf("%d\n", ans);
    }
    return 0;
}
时间: 2024-11-25 09:28:06

ZZUOJ - 1081 - 三进制小数的相关文章

三进制小数

你的任务呢,是将一个有理数转换成三进制小数."什么是三进制小数呢?"你一定会问,这很明白,就是以三为基(二进制数以2为基,而十进制数则以10为基)的小数. 输入 有理数的值都是在0与1之间的,每个有理数都由一个分子和一个分母表示,分子与分母之间隔着一个斜杠.有理数的个数不会超过1000个. 输出 输出格式见样本输出,它是以小数点开头的具有10位精度的3进制数. 样例输入 1/3 1/4 1/6 7/8 样例输出 .1000000000 .0202020202 .0111111111 .

《转》二进制与三进制的那些趣题

http://blog.csdn.net/zhuxiaoyang2000/article/details/6091767 先来思考几个问题,并不难,各位大牛应能秒杀: 1. 小明是个卖苹果的,小红一次在小明那买N(N<1024)个苹果.小明每次都要数N个苹果给小红,唉,太麻烦了.于是小明想出了一种方法:他把苹果分在10个袋子中,则无论小红来买多少个苹果,则他都可以整袋整袋的拿给小红.问怎样分配苹果到各个袋子? 2. 有16种溶液,其中有且只有一种是有毒的,这种有毒的溶液与另一种试剂A混合会变色,

豆豆的三进制计算机

时间限制: 1 Sec  内存限制: 128 MB 题目描述 豆豆最近思考计算机为什么要使用二进制的时候,突然想到为什么不使用三进制呢.三进制明显更适合人类思维.毕竟三进制可以表示事物的三种状态(真,假,未知)三进制是以3为基数的进制.和二进制一样,三进制的数位,称为三进制位(trit),通常,三进制中使用0.1.2三个数字.n!末尾有多少个0这样的问题对于豆豆来说是非常简单的.豆豆突然想到那么n!转换成3进制后,末尾有多少个0呢? 输入 一个整数n 1<=n<=1018 (多组数据) 输出

hdu 3001 Travelling TSP变形 三进制状压dp

// hdu 3001 TSP问题的变形 // 这次到每个点最多两次,所以可以用三进制的类推 // dp[S][u]表示当前在u点访问状态为S时所得到的最小的开销 // 采用刷表法,即用当前的状态推出它所能转移的状态 // dp[S][u] 可以到达的状态为dp[S+state[v]][v](dist[u][v]!=inf) // dp[S+state[v]][v] = max(dp[S+state[v]][v],dp[S][u]+dist[u][v]); // 其中每个点最多访问2次 // 技

HDU 3001 三进制状压DP

N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方程: dp[i+b[k]][k]=Min(dp[i+b[k]][k],dp[i][j]+dis[j][k]); #include "stdio.h" #include "string.h" const int inf=0x3f3f3f3f; int b[15],mark[60010][15],dp[60

hdu3001Travelling (状态压缩DP,三进制)

Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3611 Accepted Submission(s): 1132 Problem Description After coding so many days,Mr Acmer wants to have a good rest.So travelling is the b

三进制状压 HDOJ 3001 Travelling

题目传送门 题意:从某个点出发,所有点都走过且最多走两次,问最小花费 分析:数据量这么小应该是状压题,旅行商TSP的变形.dp[st][i]表示状态st,在i点时的最小花费,用三进制状压.以后任意进制状压都会了. #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int N = 11; int dp[60000][10]; int bit[N]; int d[N][N]; int p[

HDU 3001 Travelling (三进制状态压缩 DP)

题意:有 n 个city,可以选择任一城市作为起点,每个城市不能访问超过2次, 城市之间有权值,问访问全部n个城市需要的最小权值. 思路:因为每个城市可以访问最多两次,所以用三进制表示访问的状态. 详细见代码注释!!!! #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cmath> #inclu

(笔试题)N!的三进制数尾部0的个数

题目: 用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0. 思路: 这道题与上一篇博文N!尾部连续0的个数的思路是一样的. 计算N!下三进制结果末尾有多少个0,其实就是计算三进制中的3被连续进位多少次,只要将N!因式分解成3^m*other,m就是答案. 技巧性的解法就是:m=N/3+N/(3^2)+N/(3^3)....+N/(3^k) (k<=N/3) (三进制数:第一位满3进1,第二位满9进1,第三位满27进1...) 代码: #incl