HDU4814——数学,模拟进制转换
本题围绕:数学公式模拟进制转换
HDU4814 Golden Radio Base
题目描述
将一个十进制的非负整数转换成E(黄金分割数)进制的数
输入
不大于10^9的非负整数,处理到文件尾
输出
转换成的E进制数(可能含有小数)
样例输入
1
2
3
6
10
样例输出
1
10.01
100.01
1010.0001
10100.0101
题目分析
对于本题,要注意的点有:首先对于一个十进制的正数,我们是可以严格转换成一个E(黄金分割数)进制的数的,而不是涉及到约等于,例如10-base的n,可以转换成n*E^0(以下用E代表黄金分割数进制),此外本题给出的两个提示公式也是解题的关键,我们可以通过这两个公式得到如下两个公式:① E^n = E^n-1 + E^n-2, ② 2*E^n = E^n+1 + E^n-2,而本题的思路就是,建立一个数组a[]用于保存我们需要输出的最终答案,a[i]存放E的i次方的系数(就像是二进制一样),由于本题的输出可能包含小数,所以我们将数组的一半用于存放小数位的系数(E的-i次方位,因为通过两个公式我们得知,即使E的幂指数是负数公式仍然成立),同时我们通过计算得知E^50已经大于10^9,所以我们只要将数组开成100,且前50位存放小数点后的系数,后50位存放小数点前的系数,a[50]初始化时等于n(将50作为E的0次方位,正好对应我们上面讲到的10-base的n可以转换成E-base的n*E^0),而对于我们整个a[]数组,我们需要不断遍历它,一旦它满足任意位的系数大于1(可以用公式②将它的系数拆给两边的位),或者连续两个位系数大于等于1(可以用公式①将下一个位的系数加上前两个系数的小的那个值,而前两个系数则减去这个小的值)都可以用公式去进行优化,直到整个数组a[]中不能再由两个公式进行优化后,输出答案(输出时注意省略前导零和后续零,同时注意是否需要输出小数位)
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std; /*
E^n代表黄金分割数E的n次方幂
公式1:E^n = E^(n-1) + E^(n-2)
公式1推广:n*E^n = n*E^(n-1) + n*E^(n-2)
公式2:2*E^n = E^(n+1) + E^(n-2)
*/
int min(int a, int b){
return a < b ? a : b;
} int main(){
int a[];
int n;
while(scanf("%d", &n) != EOF){
memset(a, , sizeof(a));
a[] = n;
int flag = ;
while(flag){
flag = ;
for(int i = ; i <= ; i++){
if(a[i] > ){ //如果系数大于1则根据公式2将系数分给高位和低位的系数,直到本身系数为0或1
a[i+] += a[i]/;
a[i-] += a[i]/;
a[i] %= ;
flag = ; //一旦执行过这个步骤则说明高位和低位的系数发生变化,则可能出现系数大于1或连续1出现
}
if(a[i-] && a[i-]){ //先调用公式1推广,将两个连续大于等于1的系数中的最小值附加给a[i]
int temp = min(a[i-], a[i-]);
a[i-] -= temp;
a[i-] -= temp;
a[i] += temp;
// a[i-1]--; //这里有个问题就是如果写成注释里的代码TL超时
// a[i-2]--;
// a[i]++;
flag = ; //一旦a[i]增加,则a[i]有可能大于1,或者与其他相邻的数构成了连续1的情况
}
}
}
int point = ;
for(int i = ; i >= ; i--){
if(a[i] == ){
point = ;
break;
}
}
//输出时前导0和后缀0不输出,同时注意是否需要小数点
int front = ;
int back = ;
for(int i = ; i >= ; i--){
if(a[i] == && front == ){ //省略前导零
continue;
}
if(a[i] == ) front = ;
printf("%d", a[i]);
}
for(int i = ; i <= ; i++){ //找到末尾最后一个1的位置back记录
if(a[i] == ){
back = i;
break;
}
}
if(point){
printf(".");
for(int i = ; i >= back; i--) printf("%d", a[i]);
}
printf("\n");
}
return ;
}
HDU4814——数学,模拟进制转换的更多相关文章
- HDU 4937 Lucky Number (数学,进制转换)
题目 参考自博客:http://blog.csdn.net/a601025382s/article/details/38517783 //string &replace(iterator fi ...
- CodeForces 1B-字符串,进制转换与数学
一个萌新的成长之路 Background 同学们都回家了,只有我和wjh还有邢神在机房敲代码,吃random口味的方便面-- Description Translated by @PC_DOS fro ...
- C++笔记(7)——一些模拟题:简单模拟、查找元素、图形输出、日期处理、进制转换、字符串处理
以下内容基本来自<算法笔记>,作者为胡凡,建议直接买书看,我这里只是摘抄部分当笔记,不完整的. 简单模拟 就是一类"题目怎么说你就怎么做"的题目.这类题目不涉及算法,只 ...
- EOJ Monthly 2019.2 (based on February Selection) D 进制转换 【数学 进制转换】
任意门:https://acm.ecnu.edu.cn/contest/140/problem/D/ D. 进制转换 单测试点时限: 2.0 秒 内存限制: 256 MB “他觉得一个人奋斗更轻松自在 ...
- 【轻院热身赛】级数求和、进制转换、candy
[题目链接:级数求和] Problem A: 级数求和 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 409 Solved: 240 SubmitSt ...
- NOIP2000 进制转换
题一 进制转换 (18分) 问题描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之 ...
- JavaSE教程-03Java中分支语句与四种进制转换
一.分支语句 计算机源于生活,程序模拟现实生活,从而服务生活 行为模式 1,起床,刷牙,洗脸,吃早餐,上课,回家,睡觉(顺序性) 2,如果时间不太够,打个滴滴快车,如果时间够,坐个地铁(选择性) 3, ...
- JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算
JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 Android老鸟重新学一遍JAVA是什么感觉?枯燥啊,乏味啊,而且归纳写博客,都 ...
- python 内置函数 进制转换
4.内置函数 自定义函数 内置函数 len Open id() type() range() 输入输出 print() input() 强制转换 int() float() list() tuple( ...
随机推荐
- SpringBoot读取Linux服务器某路径下文件\读取项目Resource下文件
// SpringBoot读取Linux服务器某路径下文件 public String messageToRouted() { File file = null; try { file = Resou ...
- Window及document对象
注:页面上元素name属性以及JavaScript引用的名称必须一致包括大小写 否则会提示你1个错误信息 "引用的元素为空或者不是对象" 一.Window对象 ---------- ...
- [LeetCode] 334. Increasing Triplet Subsequence 递增三元子序列
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...
- Dubbo_异常_服务注册运行正常但是Dubbo-Admin看不到服务
出自:https://www.cnblogs.com/gossip/p/6021698.html 一.背景: 1.Dubbo服务正常注册到ZooKeeper 2.客户端调用Dubbo服务正常 二.原因 ...
- 容器服务如何在企业客户落地?Rancher 解决之道分享
Docker 的优势和趋势我想不必再赘述,那么对于非互联网公司的传统企业客户,以及我们大量的围绕企业客户做集成.交付解决方案的服务提供商,需要考虑的一个问题就是怎么样把容器技术以高质量.低成本.易维护 ...
- js 强制换行及 单行文字溢出时出现省略号
/*强制换行*/.f-break {word-break:break-all; /*支持IE,chrome,FF不支持*/ word-wrap:break-word;/*支持IE,chrome,FF* ...
- Google Adsense(谷歌网站联盟)广告申请指南
Google AdSense 是一种获取收入的快速简便的方法,适合于各种规模的网站发布商.它可以在网站的内容网页上展示相关性较高的 Google 广告,并且这些广告不会过分夸张醒目.由于所展示的广告同 ...
- AutoIt实现软件自动化安装
AutoIt下载安装 1.下载:https://www.autoitscript.com/site/autoit/downloads/ 2.安装,一直点下一步 3.安装好可以看到开始菜单如下(需要用到 ...
- 简述 高性能Linux服务器 模型架构 设计
主要从三个方面进行分析: 1.事件处理模式 2.并发模式 一.事件处理模式 1.Reactoor模式 定义: 主线程只负责监听文件描述符上是否有事件发生,有的话立即将该事件通知工作线程,除此之外,主线 ...
- CentOS7-Docker 搭建Maven私服
使用Docker搭建Maven私服 前言本文主要介绍,使用Docker创建一个nexus私服,然后编写一个Library,上传到私服,然后使用demo工程依赖. 本文不对Maven.Nexus.私服等 ...