【HDU 1887】Weird Numbers(负进制转换)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1887

题意:有两种操作,from-r n代表把一个-r进制下的数字n转换成10进制,to-r n代表把一个10进制下的数字n转化成-r进制。

分析:两种操作中from操作很容易实现,和转换成正进制一样,没什么好说的,而to操作我们首先可以像正常转化一样进行短除法,举个例子:

把15转化为-3进制。短除法并且倒序之后结果为1,-2,0。而我们的进制中是不能出现-2的,所以我们可以这样考虑,-2这位代表的是-3,而1位代表的是9,我们可以把-2这位加上3,这样本来应该是-3*-2=6,变成了-3*1=-3,差值为6-(-3)=9,正好为其前面一位1代表的数,这是在1进一位变成2即可,最后转换完就是2,1,0。

我们可以在做短除法的过程中进行这样的操作,发现余数小于0就让它减去r,同时商加一,最后得到的数列,倒叙就是答案。注意判to的时候如果输入的是0,需要单独输出,在这上wa了一次。

代码:

/* ***********************************************
Author        :Torrance_ZHANG
Created Time  :2016/5/2 14:32:09
File Name     :ceshi.cpp
************************************************ */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
typedef long long int LL;
using namespace std;
int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    char op[10];
    while(~scanf("%s",op)){
        if(!strcmp(op,"end"))
            break;
        if(op[0]==‘f‘){
            int r=op[5]-‘0‘;
            if(r==1) r=10;
            r*=-1;
            char num[100];
            scanf("%s",num);
            int len=strlen(num);
            int res=0,c=1;
            for(int i=len-1;i>=0;i--){
                res+=c*(num[i]-‘0‘);
                c*=r;
            }
            printf("%d\n",res);
        } else{
            int r=op[3]-‘0‘;
            if(r==1) r=10;
            r*=-1;
            int num;
            scanf("%d",&num);
            if(num==0){
                printf("0\n");
                continue;
            }
            int res[50]={0};
            int cnt=0;
            while(num!=0){
                int mod=num%r;
                num/=r;
                if(mod<0){
                    mod-=r;
                    num++;
                }
                res[cnt++]=mod;
            }
            for(int i=cnt-1;i>=0;i--)
                printf("%d",res[i]);
            puts("");
        }
    }
    return 0;
}
时间: 2024-10-03 17:47:59

【HDU 1887】Weird Numbers(负进制转换)的相关文章

HDU 5186 zhx&#39;s submissions (进制转换)

Problem Description As one of the most powerful brushes, zhx submits a lot of code on many oj and most of them got AC. One day, zhx wants to count how many submissions he made on n ojs. He knows that on the ith oj, he made ai submissions. And what yo

HDU 1887 Weird Numbers

题目要求有两种情况,第一种from情况,正常输出即可,很简单.第二种是to情况,给一个数字,输出负进制R的原码,这个有点小麻烦...解决方法如下; 首先,把这个数n按正常方式展开,形式如下: .....(n/R^k) % R, (n/R^k-1) % R , (n/R^k-2) % R,......(n/R^2) % R , (n/R^1) % R , n % R; R^(k) R^(k-1) R^(k-2) R^2 R^1 R^0 (上下对应位相乘得n); 但是我们这样展开如果直接输出是不可以

HDU1887 ZOJ2982 UVALive3958 Weird Numbers【进制】

Weird Numbers Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 594 Accepted Submission(s): 185 Problem Description Binary numbers form the principal basis of computer science. Most of you have hear

hdu 4937 Lucky Number(数学题 进制转换)2014多校训练第7场

Lucky Number                                                                          Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description "Ladies and Gentlemen, It's show time! " "A thie

枚举 + 进制转换 --- hdu 4937 Lucky Number

Lucky Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 294    Accepted Submission(s): 49 Problem Description “Ladies and Gentlemen, It’s show time! ” “A thief is a creative artist who ta

hdu 4937 Lucky Number ( 进制转换+枚举 )

题意: 有一个数n,问有多少个进制x(基数)使得n转换为x进制后的数字中只有3.4.5.6四个数. 算法: 对于只有一位数的情况,显然3.4.5.6都应该输出-1. 如果有2位数,假设这2位中高位为a,低位为b,进制为base,则 n = a * base + b,解一元一次方程即可. 如果有3位数,假设这3为从高到低分别为a.b.c,进制为base,则 n = a * base * base + b * base + c,即一元二次方程即可. 如果位数>= 4,可以暴力枚举进制数.base>

进制转换(负进制) Luogu 1017

最近匆忙刷题,突然发现自己数学废掉了 ,居然忘了进制转换了QAQ~,后来我身边的王大佬又教了我一遍. 进制转换多数用的是短除法(别人是这么叫的),就是除以进制数后,记录余数,一直除到零为止,然后把记录的余数倒序输出,10及以上的用A.B等字母表示.然而如果遇到负进制(******),就应考虑到余数为负数的情况,例如:-3 mod -2 = -1 ,这时,就应该给这个余数加上进制数的绝对值,同时将整除得到的数加上现在的余数,为了保证计算的正确性,因为我们给余数加了进制数,就相当于做除法时 被除数

hdu 2031 进制转换

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2031 题目大意:进制转换,先变成十进制在进行进制间的转化. 1 #include<stdio.h> 2 int main() 3 { 4 int n,m,i,j,f,p; 5 char a[200]; 6 while(scanf("%d%d",&n,&m)!=EOF) 7 { 8 i=0; 9 p=0; 10 if(n<0) 11 { 12 p=-1; 1

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

题目 参考自博客:http://blog.csdn.net/a601025382s/article/details/38517783 //string &replace(iterator first0, iterator last0,const_iterator first, const_iterator last); //把[first0,last0)之间的部分替换成[first,last)之间的字符串 /* 题意: 我们将3,4,5,6认为是幸运数字.给定一个十进制数n. 现在可以讲起任意转