本题围绕:数学公式模拟进制转换

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——数学,模拟进制转换的更多相关文章

  1. HDU 4937 Lucky Number (数学,进制转换)

    题目 参考自博客:http://blog.csdn.net/a601025382s/article/details/38517783 //string &replace(iterator fi ...

  2. CodeForces 1B-字符串,进制转换与数学

    一个萌新的成长之路 Background 同学们都回家了,只有我和wjh还有邢神在机房敲代码,吃random口味的方便面-- Description Translated by @PC_DOS fro ...

  3. C++笔记(7)——一些模拟题:简单模拟、查找元素、图形输出、日期处理、进制转换、字符串处理

    以下内容基本来自<算法笔记>,作者为胡凡,建议直接买书看,我这里只是摘抄部分当笔记,不完整的. 简单模拟 就是一类"题目怎么说你就怎么做"的题目.这类题目不涉及算法,只 ...

  4. EOJ Monthly 2019.2 (based on February Selection) D 进制转换 【数学 进制转换】

    任意门:https://acm.ecnu.edu.cn/contest/140/problem/D/ D. 进制转换 单测试点时限: 2.0 秒 内存限制: 256 MB “他觉得一个人奋斗更轻松自在 ...

  5. 【轻院热身赛】级数求和、进制转换、candy

    [题目链接:级数求和] Problem A: 级数求和 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 409  Solved: 240 SubmitSt ...

  6. NOIP2000 进制转换

    题一   进制转换              (18分)  问题描述      我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之 ...

  7. JavaSE教程-03Java中分支语句与四种进制转换

    一.分支语句 计算机源于生活,程序模拟现实生活,从而服务生活 行为模式 1,起床,刷牙,洗脸,吃早餐,上课,回家,睡觉(顺序性) 2,如果时间不太够,打个滴滴快车,如果时间够,坐个地铁(选择性) 3, ...

  8. JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算

    JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 Android老鸟重新学一遍JAVA是什么感觉?枯燥啊,乏味啊,而且归纳写博客,都 ...

  9. python 内置函数 进制转换

    4.内置函数 自定义函数 内置函数 len Open id() type() range() 输入输出 print() input() 强制转换 int() float() list() tuple( ...

随机推荐

  1. Python线程池及其原理和使用(超级详细)

    系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即 ...

  2. IIS配置实现反向代理(图文)

    需求: 网站在备案,本来的网站不符合要求,先反向到别的网站.原网站:test.com, 目标网站:target.com 设置反向代理的服务器一定是在原网站服务器上. 注意:iis应该是iis7及以上版 ...

  3. Visual Studio 2017 Add WSDL

    Normal way Right click Project -> Add -> Web Reference -> Advanced Intranet way download ws ...

  4. Ubuntu16.0.4安装OpenCV3.4.2

    (1)到官网下载opencv3.4.2,链接:https://opencv.org/releases.html (2)下载opencv_contrib,链接:https://github.com/op ...

  5. 使用docker-compose快速搭建gitlab

    1. 准备工作: centos7 [root@dev_vonedao_95 gitlab]# docker -v Docker version , build 633a0ea [root@dev_vo ...

  6. C语言 小球撞击反弹

    计算法(略) #include <stdio.h> #include <stdlib.h> int main() { int x, y, a, resu; scanf(&quo ...

  7. VB.NET 读写XML

    Public Class CSysXML Dim mXmlDoc As New System.Xml.XmlDocument Public XmlFile As String Public Sub N ...

  8. Jmeter相关参数

    一.线程组 线程组主要包含三个参数:线程数.准备时长(Ramp-Up Period(in seconds)).循环次数. 线程数:虚拟用户数.一个虚拟用户占用一个进程或线程.设置多少虚拟用户数在这里也 ...

  9. Unity - 绘制正五边形网格

    本文简述了Unity中绘制正五边形网格的基本方法:计算顶点信息.设置三角形覆盖信息.创建配置mesh 绘制方法 基本思路:计算出五边形顶点坐标信息作为数组,设置三角形包围方式,再创建新的mesh配置v ...

  10. 使用UltraISO制作U盘系统安装盘

    现在的电脑设备上光驱设备用的越来越少了,甚至很多新买的电脑或者笔记本都已经不再标配光驱,所以造就了使用U盘安装系统大行其道.U盘安装系统的方式有很多种,目前用的最多的可能就是使用PE系统,而我们这里介 ...