UVALive 3958 Weird Numbers (负进制数)
Weird Numbers
题目链接:
http://acm.hust.edu.cn/vjudge/contest/129733#problem/F
Description
Binary numbers form the principal basis of computer science. Most of you have heard of other systems, such as ternary, octal, or hexadecimal. You probably know how to use these systems and how to convert numbers between them. But did you know that the system base (radix) could also be negative? One assistant professor at the Czech Technical University has recently met negabinary numbers and other systems with a negative base. Will you help him to convert numbers to and from these systems?
A number N written in the system with a positive base R will always appear as a string of digits between 0 and R - 1 , inclusive. A digit at the position P (positions are counted from right to left and starting with zero) represents a value of RP . This means the value of the digit is multiplied by RP and values of all positions are summed together. For example, if we use the octal system (radix R = 8 ), a number written as 17024 has the following value:
1*8 4 +7*8 3 +0*8 2 +2*8 1 +4*8 0 = 1*4096 + 7*512 + 2*8 + 4*1 = 7700
With a negative radix - R , the principle remains the same: each digit will have a value of (- R)P . For example, a negaoctal (radix R = - 8 ) number 17024 counts as:
1*(- 8) 4 +7*(- 8) 3 +0*(- 8) 2 +2*(- 8) 1 +4*(- 8) 0 = 1*4096 - 7*512 - 2*8 + 4*1 = 500
One big advantage of systems with a negative base is that we do not need a minus sign to express negative numbers. A couple of examples for the negabinary system (R = - 2) :
You may notice that the negabinary representation of any integer number is unique, if no "leading zeros" are allowed. The only number that can start with the digit "0", is the zero itself.
Input
The input will contain several conversions, each of them specified on one line. A conversion from the decimal system to some negative-base system will start with a lowercase word "to" followed by a minus sign (with no space before it), the requested base (radix) R , one space, and a decimal number N .
Output
For each conversion, print one number on a separate line. If the input used a decimal format, output the same number written in the system with a base - R . If the input contained such a number, output its decimal value.
Both input and output numbers must not contain any leading zeros. The minus sign "-" may only be present with negative numbers written in the decimal system. Any non-negative number or a number written in a negative-base system must not start with it.
Sample Input
```
to-2 10
from-2 1010
to-10 10
to-10 -10
from-10 10
end
```
Sample Output
```
11110
-10
190
10
-10
```
Source
2016-HUST-线下组队赛-2
##题意:
对给定的数,从指定负进制转成十进制,或从十进制转成负进制数.
##题解:
from操作跟正进制一样,比较简单.
对于to操作:[负进制数](http://baike.baidu.com/link?url=hk4TMW9mCVKEAWfDVCECQAFJ_GXcQJTMgh1juL2R4lCjxL6vzVi4ufEHF9cn-aWSReWaorH0kFLheWTWhx1JzK)
数n转成正进制r的过程:不停地模r、除r,直到n为0. 得到的余数序列就是结果.
当r是负数时,进行上述过程可能会得到负余数,这不符合结果.
所以在得到负余数时,商加一,余数减radix,使得余数为正再进行下一步.
比赛时用的暴力枚举,根据当前位表示数的范围和唯一性来确定每一位数. 远不如这个简洁.
##代码:
``` cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define eps 1e-8
#define maxn 25
#define mod 100000007
#define inf 0x3f3f3f3f
#define mid(a,b) ((a+b)>>1)
#define IN freopen("in.txt","r",stdin);
using namespace std;
int radix;
char str[50];
int main(int argc, char const *argv[])
{
//IN;
while(scanf("%s", str) != EOF && str[0] != 'e')
{
if(str[0] == 'f') {
sscanf(str+4, "%d", &radix);
char num[50];
scanf("%s", num);
int ans = 0;
for(int i=0; i<strlen(num); i++) {
ans = ans*radix + num[i] - '0';
}
printf("%d\n", ans);
}
else {
sscanf(str+2, "%d", &radix);
int n; scanf("%d", &n);
int ans[50] = {0}, cnt = 0;
do { // 处理 n=0
int last = n % radix;
n = n / radix;
if(last < 0) last -= radix, n += 1;
ans[cnt++] = last;
} while(n);
for(int i=cnt-1; i>=0; i--)
printf("%d", ans[i]);
printf("\n");
}
}
return 0;
}
UVALive 3958 Weird Numbers (负进制数)的更多相关文章
- CF459C Pashmak and Buses (构造d位k进制数
C - Pashmak and Buses Codeforces Round #261 (Div. 2) C. Pashmak and Buses time limit per test 1 seco ...
- C++中,将单精度浮点数转换成2进制数
在C++里,实数(float)是用四个字节即三十二位二进制位来存储的.其中有1位符号位,8位指数位和23位有效数字位.实际上有效数字位是24位,因为第一位有效数字总是"1",不必存 ...
- [转]as3 算法实例【输出1 到最大的N 位数 题目:输入数字n,按顺序输出从1 最大的n 位10 进制数。比如输入3,则输出1、2、3 一直到最大的3 位数即999。】
思路:如果我们在数字前面补0的话,就会发现n位所有10进制数其实就是n个从0到9的全排列.也就是说,我们把数字的每一位都从0到9排列一遍,就得到了所有的10进制数. /** *ch 存放数字 *n n ...
- 1813. M进制数问题
1813. M进制数问题 Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description 试用 C++的类来表示一般进制数. 给定 2 ...
- [codevs1157]2^k进制数
[codevs1157]2k进制数 试题描述 设r是个2k 进制数,并满足以下条件: (1)r至少是个2位的2k 进制数. (2)作为2k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ...
- noip2006 2^k进制数
设r是个2k进制数,并满足以下条件: (1)r至少是个2位的2k进制数. (2)作为2k进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w ...
- c++描述将一个2进制数转化成10进制数(用到初始化栈,进栈,入栈)
/* c++描述将2进制数转化成10进制数 问题,1.初始化栈后,用new,不知道delete是否要再写一个函数释放内存, 还是在哪里可以加上delete 2.如果栈满了,我要分配多点空间,我想的办法 ...
- 关于不同进制数之间转换的数学推导【Written By KillerLegend】
关于不同进制数之间转换的数学推导 涉及范围:正整数范围内二进制(Binary),八进制(Octonary),十进制(Decimal),十六进制(hexadecimal)之间的转换 数的进制有多种,比如 ...
- NOIP2006 2k进制数
2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换 ...
随机推荐
- 使用foreach一次性添加多个单选按钮
<?php //这个函数创建一个单选按钮 //函数接收一个论据:值 //函数也会让按钮有"黏性"-->记住你是如何填写它的. function create_radio ...
- 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题
链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...
- tensorflow学习笔记一----------tensorflow安装
2016年11月30日,tensorflow(https://www.tensorflow.org/)更新了0.12版本,这标志着我们终于可以在windows下使用tensorflow了(但是还是推荐 ...
- git命令?
#文件及文件夹创建删除 mkdir 文件名称 (创建文件夹) touch 文件名称 (创建文件) rm -r 文件名称 (递归删除) rm -rf 文 ...
- PHP批量导入excell表格到mysql数据库
PHP批量导入excell表格到mysql数据库,本人通过亲自测试,在这里分享给大家 1,下载 php excell类库 网上搜索可以下载,这里不写地址 2,建html文件 <form met ...
- sql 字符串 切割函数 FUN_Split
IF EXISTS ( SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FUN_Split]') AND OBJECTPROPER ...
- ASP.net解析JSON
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- javascript 输入框监听事件
<div class="coupon-exchange clearfix"> <div class="code-input"> < ...
- ubuntu 安装nvidia driver
错误的命令:sudo apt-get install nvidiar-430好多教程都是这样 sudo apt-get install nvidia-driver-430 很奇怪这个命令变成这样 h ...
- 关于 const char *ptr,char const *ptr,char *const ptr 的讨论
对于每个做C/C++的伙伴来说,面试中少不了关于const 的考察,尤其是对于刚毕业的新人. 今天听见同事在讨论这个问题,就随手写一下自己的理解.希望对大家又所帮助. 首先来说一下char *ptr: ...