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( ...
随机推荐
- cmake 指定gcc/g++版本
export CC=/usr/local/bin/gcc export CXX=/usr/local/bin/g++ cmake /path/to/your/project make
- HTML5 VUE单页应用 SEO 优化之 预渲染(prerender-spa-plugin)
前言:当前 SPA 架构流行的趋势如日中天,前后端分离的业务模式已经成为互联网开发的主流方式,但是 单页面 应用始终存在一个痛点,那就是 SEO, 对于那些需要推广,希望能在百度搜索时排名靠前的网站而 ...
- HttpClient get请求获取数据流
HttpClient get请求获取数据流,将数据保存为文件 public String getStreamFile(String url) throws Exception { HttpClient ...
- Xamarin Assets文件读取
在Assets文件夹中添加nlog.config文件,在属性中将Build Action设置为AndroidAsset var steam = Assets.Open("nlog.confi ...
- 【C/C++开发】C++11的模板类型判断——std::is_same和std::decay
C++11的模板类型判断--std::is_same和std::decay 问题提出:有一个模板函数,函数在处理int型和double型时需要进行特殊的处理,那么怎么在编译期知道传入的参数的数据类型是 ...
- mysql 初级练习题
1.题目 第一题: tb_user: User_id User_name User_phone 1 张三 13800138000 2 李四 13800138001 tb_customer: Custo ...
- js中常用的获得日期对象的方法
// 默认是当前时区的日期和时间 var date = new Date(); // 获取特定日期和时间的日期对象,需要传递毫秒数,不过可以传递规范日期格式字符串来代替 // 一些常见的日期格式 // ...
- python教程:用简单的Python编写Web应用程序
python现在已经成为很多程序员关注的编程语言之一,很多程序员也都开始弄python编程,并且很多时候都会用自己的操作来选择,而现在不管是程序员还是少儿编程,都会有python这门课,今天就和大家分 ...
- STM32 EV1527无线通信(433)
EV1527无线通信 先说一下这个通信协议的数据格式,这个图片是我在手册里截的. 大家按照单片机类型计算周期,我的是STM32f103vb (4CLK大致等于350um) 发送时按照 先发同步码后发D ...
- c语言 判断字符串长度 实现
/* 首先明白答案的本质(该函数)是一个计数器该计数器用for循环来实现实现对一串字符串的计数字符串以空格开头 不计算空格 计算空格后的数字直到遇到\0结束.num计算器字符串不以空格结束 计算空格后 ...