poj1220(短除法实现任意进制转换)
题目链接:https://vjudge.net/problem/POJ-1220
题意:给定a进制的大数s,将其转换为b进制。其中2<=a,b<=62。
题意:一般进制转换是以10进制为中介进行转换,但这里的s太大了,大概10^500,如果要转换十进制来算必须要手写高精度模板或者用Java的API。这里我用的短除法,复杂度比较小。原理大致是将s每次除以b,得到的余数的逆序列是b进制表示的结果。每次除的时候用到同余模定理,即从最高位开始除,得到的余数乘以a加到下一位,一直到最低位。
AC代码:
#include<cstdio>
#include<cstring>
using namespace std; int a,b,T,t1[],t2[];
char s[]; int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d%s",&a,&b,s);
int len=strlen(s);
for(int i=;i<len;++i){
if(s[i]>='A'&&s[i]<='Z') t1[len--i]=s[i]-'A'+;
else if(s[i]>='a'&&s[i]<='z') t1[len--i]=s[i]-'a'+;
else t1[len--i]=s[i]-'';
}
int k=;
while(len){
for(int i=len-;i>;--i){
t1[i-]+=t1[i]%b*a;
t1[i]/=b;
}
t2[k++]=t1[]%b;
t1[]/=b;
while(len&&!t1[len-]) --len;
}
printf("%d %s\n%d ",a,s,b);
for(int i=k-;i>=;--i){
if(t2[i]>=&&t2[i]<=) printf("%d",t2[i]);
else if(t2[i]>=&&t2[i]<=) printf("%c",t2[i]-+'A');
else printf("%c",t2[i]-+'a');
}
printf("\n\n");
}
return ;
}
附上Java代码(219ms,4528KB):
import java.io.*;
import java.math.*;
import java.util.*; public class Main{
public static void main(String args[]){
Scanner cin=new Scanner(System.in);
int T;
BigInteger a,b,sum;
T=cin.nextInt();
while((T--)!=0){
a=cin.nextBigInteger();
b=cin.nextBigInteger();
String s=cin.next();
sum=BigInteger.valueOf(0);
for(int i=0;i<s.length();++i){
char c=s.charAt(i);
int tmp;
if(c>='0'&&c<='9') tmp=c-'0';
else if(c>='A'&&c<='Z') tmp=c-'A'+10;
else tmp=c-'a'+36;
sum=sum.multiply(a);
sum=sum.add(BigInteger.valueOf(tmp));
}
BigInteger zero=BigInteger.valueOf(0);
int ans[]=new int[1005];
int k=0;
while(sum.compareTo(zero)!=0){
ans[k++]=sum.mod(b).intValue();
sum=sum.divide(b);
}
System.out.print(a+" "+s+"\n"+b+" ");
if(k==0) System.out.print(0); //注意为0的情况
for(int i=k-1;i>=0;--i){
int tmp=ans[i];
char c;
if(tmp<=9) c=(char)('0'+tmp);
else if(tmp<=35) c=(char)('A'+tmp-10);
else c=(char)('a'+tmp-36);
System.out.print(c);
}
System.out.print("\n\n");
}
}
}
poj1220(短除法实现任意进制转换)的更多相关文章
- poj1220 (高精度任意进制转换)
http://poj.org/problem?id=1220 高精度任意进制转换 代码是从discuss里找到的,据说是maigo神牛写的. 超精简!! 我自己第一写的时候,还把n进制先转成10进制, ...
- python任意进制转换
python任意进制转换 import string def module_n_converter(q, s, base=None): """ 将自然数按照给定的字符串转 ...
- Python版任意进制转换
def decimalToAny(num,n): baseStr = {10:"a",11:"b",12:"c",13:"d&qu ...
- 2~62位任意进制转换(c++)
进制转换的符号表为[0-9a-zA-Z],共61个字符,最大可表示62进制. 思路是原进制先转换为10进制,再转换到目标进制. 疑问: 对于负数,有小伙伴说可以直接将符号丢弃,按照整数进行进位转换,最 ...
- 【C/C++】任意进制转换
进制转换:R进制->10进制:10进制->R进制. #include<bits/stdc++.h> using namespace std; /*函数:r进制转换成10进制*/ ...
- itoa()、atoi()、任意进制转换
头文件:<stdlib.h> itoa --功能:将任意类型的数字转换为字符串.在<stdlib.h>中与之有相反功能的函数是atoi. atoi----功 能: 将字符串转换 ...
- (任意进制转换)将 r 进制数转成 k 进制数
我们知道任意进制转换为十进制,都是乘以基数的多少次方,然后相加: 十进制转换为任意进制,都是除以基数,然后倒着取余数: 所以这里是用十进制数中转,实现任意进制数的转换 #include<iost ...
- lua之m进制转换为n进制-任意进制转换算法
够无聊的写这个,为防止需要的人也无聊一遍,写个吧 算法有n种,但是,咱们一种就够用了 --数组倒序排列 local function orderByDesc( input ) local output ...
- 在线任意进制转换工具 - aTool在线工具
http://www.atool.org/hexconvert.php ss = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ ...
随机推荐
- JAVA笔记10-抽象类
(1)abstrac关键字类修饰的类是抽象类,用abstract修饰的方法是抽象方法: (2)含有抽象方法的类必须被定义为抽象类: (3)抽象类必须被继承,抽象方法必须被重写(或者将子类也声明为抽象类 ...
- Python 文件I/O Ⅳ
Python里的目录: 所有文件都包含在各个不同的目录下,不过Python也能轻松处理.os模块http://www.xuanhe.net/有许多方法能帮你创建,删除和更改目录. mkdir()方法 ...
- [转帖]H5 手机 App 开发入门:技术篇
H5 手机 App 开发入门:技术篇 http://www.ruanyifeng.com/blog/2019/12/mobile-app-technology-stack.html 阮一峰老师的文 ...
- 数组 slice方法和splice方法的区别
一.slice() 方法 slice()方法可以从已有的数组中返回选定的元素. 语法: arrayObject.slice(start,end) 参数: start:(截取开始位置的索引,包含开始索引 ...
- 「SDOI2017」硬币游戏
题目链接 问题分析 首先一个显然的做法就是建出AC自动机,然后高斯消元.但是这样的复杂度是\(O(n^3m^3)\)的. 我们发现其实只需要求AC自动机上\(n\)个状态的概率,而其余的概率是没有用的 ...
- vue的基础数据绑定
todo https://www.jb51.net/article/132344.htm
- Spring data redis-StringRedisTemplate 用法
Spring-data-redis为spring-data模块中对redis的支持部分,简称为“SDR”,提供了基于jedis客户端API的高度封装以及与spring容器的整合,事实上jedis客户端 ...
- Django JWT
概述 如果各位不了解 JWT,不要紧张,它并不可怕. JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个 ...
- crossdomain.xml解决跨域问题
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- 机器学习模型解释工具-Lime
本篇文章转载于LIME:一种解释机器学习模型的方法 该文章介绍了一种模型对单个样本解释分类结果的方法,区别于对整体测试样本的评价指标准确率.召回率等,Lime为具体某个样本的分类结果做出解释,直观地表 ...