http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2062

题目大意就是给你一个-1000,000,000到1000,000,000的数转化成-2进制。

看到-2就想到了2进制,原先想两位两位地考虑,然后看成2进制的,接下来求一下方程的正数解就行了,然后将那些数全都转化成0和1,后来又发现。。每项之间差了4倍,顿时就不行了。接着想着是不是能将 (-2)^k 和 2^k 联系起来,那问题就简单了。

后来看到了一个式子,顿时有了点灵感 : (4)^3 = (-4)^4 + (4 - 1) * (-4)^3

想了想后总结出来了一个结论

①当k是奇数的时候, 2^k = (-2)^(k+1) + (-2)^k;

②当k是偶数的时候, 2^k = (-2)^k;

推导的过程中也有遇到一些问题,一直想把偶数和奇数的情况联系在一起,但是感觉做不到,而且可能会出现负数,出现负数就不好处理了。

有了以上的结论,差不多就可以开始动手了。但是突然想到,负数的话,算出来的东西就会出问题了,想了想,负数和整数应该有类似的结论,经过尝试后推倒出这样的结论。

①当k是奇数的时候, -2^k = (-2)^k;

②当k是偶数的时候, -2^k = (-2)^(k + 1) + (-2)^(k + 1);

接下来就开始写代码了,但是测试了一下,一些数转化后出现了让人觉得很囧的大于1的数字,突然想到还要经行进位处理。想了想挺容易推导的,但是注意最好不要出现负数的情况,不然就不好处理了。

2 * (-2)^k = (-2)^(k + 1) + (-2)^(k + 2);

于是进位的操作就ok了

但程序到这里还是有bug的,试了一下1000,000,000,结果发现后面的结果还是很正常,前面多出了个4,顿时觉得很纳闷,然后认真地调试了下,发现出现了一个4和2的循环,高位的系数是2,低位的系数是4,突然反应过来,完全是可以抵消掉的,但是没有抵消就出现了4和2的循环。

ans[k+1] = 2ans[k];

每次进位前先进行抵消操作,然后开始进位,接下来程序终于没了bug了,顺利AC了。

其实这个还是可以推广的,按照刚才的公式,我们假设现在是(-b)进制,有以下的结论

n为正数

①当k为奇数的时候,b^k = (-b)^(k + 1) + (b - 1) * (-b)^k

②当k为偶数的时候,b^k = (-b)^k;

n为负数

①当k为奇数的时候,- b^k = (-b)^k;

②当k为偶数的时候,- b^k = (-b)^(k + 1) + (b - 1) * (-b) ^ k;

进位:

①当k为偶数的时候,b * (-b)^k = (-b)^(k + 1);

②当k为奇数的时候,b * (-b)^k = - b^(k + 1) = - (-b)^(k + 1) = - b^(k + 1) = (-b)^(k + 2) + (b - 1) * (-b)^(k + 1);

抵消

ans[k+1] = b * ans[k];

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long LL;
const int MAXN = 64 + 5;int n, flag;
int ans[MAXN];int main()
{int tCase;while(scanf("%d", &tCase) != EOF)for(int T = 1; T <= tCase; ++ T){flag = 1;scanf("%d", &n);memset(ans, 0, sizeof(ans));if(n < 0){flag = 0;n = ~n + 1;}//转化for(int i = 0; i < 31; ++ i)if(n & (1 << i)){++ans[i];if((i & 1) == flag)++ans[i + 1];}//进位for(int i = 0; i < MAXN - 1; ++ i){//抵消if(ans[i] >= ((ans[i + 1] >> 1) << 1)){ans[i] -= ((ans[i + 1] >> 1) << 1);ans[i + 1] -= (ans[i + 1] >> 1);}while(ans[i] > 1){++ans[i + 1];++ans[i + 2];ans[i] -= 2;}}printf("Case #%d: ", T);for(int i = MAXN - 1; i > 0; -- i)if(ans[i] != 0){for(int j = i; j > 0; --j)putchar(ans[j] + '0');break;}putchar(ans[0] + '0');putchar('\n');}return 0;
}

View Code

转载于:https://www.cnblogs.com/tank39/p/3911404.html

UVa 11121 - Base -2 负进制的转化和推广相关推荐

  1. UVALive 3958 Weird Numbers (负进制数)

    Weird Numbers 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/F Description Binary number ...

  2. 【进制转换】负进制转换 多进制转换

    1.负进制转换 洛谷P1017 进制转换 负进制的转换和正进制的转换雷同,都是用短除取余法,这里要保证余数都要是正数才行: 要想让本来余数是负数变为正数,其实很好操作,就直接让商+1,余数-(相应的进 ...

  3. 2021微软暑期实习机试,负进制转换,十进制转-2进制

    2021微软暑期机试题,进制转换 一 前言 二 解题步骤 2.1 题目描述 2.1.1 简述前两题 2.1.2 2.2解题思路 2.3代码思路 三 问题和启发 3.1 遇到的一些问题 3.2 考虑-3 ...

  4. 16进制ff转化为二进制_3秒钟快速转换十六进制为二进制

    这里介绍下如何快速将十六进制转换为二进制: 举例,ipv6地址:FE80::1 先将FE80拆分为FE和80,我们知道F是十进制的15,E为14,我们知道二进制的八位组,全为1时(1111 1111) ...

  5. 将一个10进制数转化为任意进制数 猜拳小游戏

    1.如何将一个10进制数,转化为2~16进制之间的数.且当数字>=10时,输出相对应的字母A~F 2.制作一个猜拳的小游戏 一.10进制转化为任意进制 1.首先知道进制的转化规则------可参 ...

  6. UVa 11121 Base -2(负数进制)

    题意: 给定一个大于等于0的整数n,求n的-2进制数. 思路: 1. 对于2进制的,大家都是熟悉的: a[i] = n % 2; n = n/2; 2. 是否发现上面少了一个地方呢?n = n/2是否 ...

  7. UVA10473 Simple Base Conversion【进制转换】

    In this problem you are asked to write a simplebase conversion program. You will be givena hexadecim ...

  8. UVA - 11121 Base -2

    题目大意:给出一个十进制的数,将这个数转换成-2进制的数. 解题思路:进制转化是一种很简单的题型,可是对于负数的进制来说我就很陌生了,研究了蛮久的,这里分享一下. 首先要了解如何将一个-2进制的数转换 ...

  9. Uva 11121 Base -2

    题意:把一个十进制数转换成-2进制数,并且(-2)进制数的值只有01两种情况 思路:因为只有01两种情况,本来应该有-1 1 0 三种的,所以必须把-1换成1,怎么换就得推了 举个例子,第0次:100 ...

最新文章

  1. 李宗纯:图机器学习在度小满风控中的应用
  2. 字符串匹配的KMP算法和C语言代码,不需要思考就能理解
  3. hdu3786 找出直系亲属 水题
  4. 小程序云开发使用where查询遇到的问题
  5. jboss war包放哪_如何将JBoss HR Employee Rewards项目放入云端
  6. 不更新安装包,实现文件更新 奕婷特许授权发布
  7. java 同步 变量,在java中的对象上同步,然后更改同步的变量的值
  8. markdown文档中利用Mathpix Snip软件插入公式
  9. JAVA并发之多线程基础(3)
  10. iOS UITextField限制输入字数
  11. foxmail创建163公司企业邮箱的时候会出现ERR Unable to log on
  12. c++获取ctrl+v内容_处理文档时,快捷键「Ctrl+E」的 8 大妙用
  13. java 线程 寄存器 地址_Java高级进阶多线程学习之路(四)CPU与内存
  14. 《JSP实用教程(第2版)/耿祥义》错误之处理汉字乱码
  15. Window平台编译log4cpp使用方法记录 (二)
  16. Topaz Sharpen AI 人工智能锐化插件
  17. 新的一年,如何做好日计划、月计划与年计划?
  18. ideal拉代码和提交代码
  19. mysqli assoc php,关于php:mysqli_fetch_assoc()期望参数1为mysqli_result,给定布尔值
  20. 超赞,52个数据可视化图表鉴赏!

热门文章

  1. 用Django开发Web应用程序异常
  2. IT-标准化(中国)有限公司-网络拓朴图
  3. 我的家乡-客家小山村
  4. Whose Hall?
  5. computer science sticker
  6. 在正确的方向坚持下去,一直坚持下去,直到有成果
  7. 看一下iFM最新文章
  8. 13.3的MacBook air 8g内存还是有点吃力
  9. unity安装,sdk,jdk问题
  10. 关于各组评价的自我评价