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( ...
随机推荐
- git clone 某个链接时候报错Initialized empty Git repository in 不能克隆
查看下是不是git是不是1.7.1版本. git --version 使用 yum -y update 更新一下. 再使用git clone 虽然还是会提示这个报错,但是可以克隆了.亲测有效. git ...
- web page popup window model
jQuery UI dialog: https://jqueryui.com/dialog/ Semantic UI https://semantic-ui.com/modules/modal.htm ...
- python安装 错误 “User installations are disabled via policy on the machine”
解决方法一: 1.在运行里输入 gpedit.msc 2.计算机配置管理>>管理模板>>windows组件>>windows Installer>> ...
- Linux字符设备驱动实例—globalmem驱动
1.globalmem虚拟设备实例 globalmem为“全局内存”的意思,在globalmem字符设备中会分配一片大小为GLOBALMEM_SIZE(4KB)的内存空间,并在驱动中提供对这片内存的读 ...
- JDK本地内存追踪NMT
通常情况下, JVM占用的内存不仅仅是-Xmx, -Xms等指定的大小, 因为JVM也是一个应用, 它需要额外的空间去完成它的工作, 除了堆外, JVM会分配内存的地方包括以下这些: Metaspac ...
- day51——对象、BOM对象、DOM对象
day51 JSON对象 var a = {'name':'太白','age':89}; 序列化:var b = JSON.stringify(a); 反序列化:var c = JSON.parse( ...
- python3 安装 pyinstaller 时报错的解决办法
如上图所示,在安装的过程中发现是所关联的一个 future模块安装失败,庵后我有单独安装了一下这个future,发现还是失败 然后在网上寻找解决办法,最后找到了这个指令,pip install fut ...
- head first c# -- 第七章 (接口与抽象类)
接口的作用: 例子:有鸡,鸭,牛,羊4个类,还有farmer类: farmer.feed(obj obj) { obj.eat() } // 没有接口: farmer.feedChicken(Chic ...
- PHP 输入输出流 php://input 获取表单中2个重名name的值
PHP 输入输出流 php://input 获取表单中2个重名name的值 <?php // PHP有一种"所有IO都是流"的说法. // 压缩流参考 https://w ...
- asp.net EFcore配置链接sqlserver
1. 首先我们先用vs2017 创建一个空的 asp.net core api 项目 2. 在生成的解决方案下在建立一个访问数据库使用的类库CoreApi.Model,注意要选择.netcore下的 ...