九度oj 题目1080:进制转换
- 题目描述:
-
将M进制的数X转换为N进制的数输出。
- 输入:
-
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
- 输出:
-
输出X的N进制表示的数。
- 样例输入:
-
16 10
F
- 样例输出:
-
15
- 提示:
-
输入时字母部分为大写,输出时为小写,并且有大数据。
这题初看起来另我头疼,考虑不难但是很麻烦
一开始想的比较绕,准备先把任意进制转换成10进制,再转化成n进制,于是写出了下面的代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream> using namespace std; char mnum[];
int nnum[];
int tnCnt; int tnum[];
int tCnt; int tm[];
int tmCnt; int tSum[];
int tsCnt; int tDiv[];
int tdCnt; int m, n; int getV(char a) {
if(a >= '' && a <= '') {
return a - '';
}
else if(a >= 'a' && a <= 'z') {
return a - 'a' + ;
}
else if(a >= 'A' && a <= 'Z') {
return a - 'A' + ;
}
} char putV(int a) {
if(a >= && a <= ) {
return a + '';
}
else {
return a - + 'a';
}
} void multiTm() {
int ci = ;
int j = ;
for(int i = ; i < tmCnt; i++) {
int ben = tm[i] * m + ci;
tm[j++] = ben % ;
ci = ben/;
}
if(ci != ) {
tm[j++] = ci;
}
tmCnt = j;
} int multi(int a[], int acnt, int b[], int t) {
int ci = ;
int j = ;
for(int i = ; i < acnt; i++) {
int ben = a[i] * t + ci;
b[j++] = ben % ;
ci = ben/;
}
if(ci != ) {
b[j++] = ci;
}
return j;
} int add(int a[], int acnt, int b[], int bcnt) {
int p = max(acnt, bcnt);
int j = ;
int ci = ;
for(int i = ; i < p; i++) {
int ben = a[i] + b[i] + ci;
a[j++] = ben % ;
ci = ben/;
}
if(ci != ) {
a[j++] = ci;
}
return j;
} int div(int t) {
int j = ;
int ci = ;
for(int i = ; i < tdCnt; i++) {
int ben = ci* + tDiv[i];
tDiv[j++] = ben/t;
ci = ben%t;
//printf("%d\n",ci);
}
int state = ;
int p = ;
for(int i = ; i < j; i++) {
if(state == && tDiv[i] != ) {
state = ;
tDiv[p++] = tDiv[i];
}
else if(state == ) {
tDiv[p++] = tDiv[i];
}
}
tdCnt = p; /*for(int i = 0; i <= tdCnt; i++) {
printf("%d",tDiv[i]);
}
puts("");*/ return ci;
} int main(int argc, char const *argv[])
{
while(scanf("%d %d",&m,&n) != EOF) {
scanf("%s",mnum);
//to-ten
int lenm = strlen(mnum); memset(tm, , sizeof(tm));
tm[] = ;
tmCnt = ; memset(tnum, , sizeof(tnum));
tCnt = ; for(int i = lenm -; i >= ; i--) {
int tmp = getV(mnum[i]);
memset(tSum, , sizeof(tSum));
tsCnt = ;
tsCnt = multi(tm, tmCnt, tSum, tmp);
tCnt = add(tnum,tCnt,tSum,tsCnt);
multiTm();
} /*for(int i = tCnt-1; i >= 0; i--) {
printf("%d",tnum[i]);
}
puts("");*/
for(int i = tCnt-; i >= ; i--) {
tDiv[tCnt-i-] = tnum[i];
}
tdCnt = tCnt;
int j = ;
memset(nnum, , sizeof(nnum));
while(!(tdCnt == && tDiv[] == )) {
nnum[j++] = div(n);
}
for(int i = j-; i >= ; i--) {
printf("%c",putV(nnum[i]));
}
puts("");
}
return ;
}虽然例子能跑出来,但提交答案错误
后来一拍脑门,进制直接除n取余就好了,转化成10进制简直多此一举,于是写出下面代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream> using namespace std; char mnum[]; int tDiv[];
int ds, de; int nnum[];
int nCnt; int m,n; int getV(char a) {
if(a >= '' && a <= '') {
return a - '';
}
else if(a >= 'A' && a <= 'Z') {
return a - 'A' + ;
}
else if(a >= 'a' && a <= 'z') {
return a - 'a' + ;
} } char putV(int a) {
if(a >= && a <= ) {
return a + '';
}
else {
return a - + 'a';
}
} int div() {
int j = ;
int ci = ;
for(int i = ; i < de; i++) {
int ben = ci*m + tDiv[i];
tDiv[j++] = ben/n;
ci = ben%n;
}
int i = ;
while(tDiv[i] == ) {
i++;
}
ds = i;
return ci;
} int main(int argc, char const *argv[])
{
while(scanf("%d %d",&m,&n) != EOF) {
scanf("%s",mnum);
int lenm = strlen(mnum); for(int i = ; i < lenm; i++) {
tDiv[i] = getV(mnum[i]);
} ds = , de = lenm;
tDiv[de] = -;
int j = ;
memset(nnum, , sizeof(nnum));
while(ds != de) {
nnum[j++] = div();
}
for(int i = j-; i >= ; i--) {
printf("%c",putV(nnum[i]));
}
puts("");
}
return ;
}虽然通过,但耗时70ms
考虑有没有优化的空间,观察一下div 函数,每回都从0开始除,其实每回应该从ds除就好了。50行也应该从ds开始找,但注意j初值也为ds
另外,输出也可改一下
代码如下
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream> using namespace std; char mnum[]; int tDiv[];
int ds, de; int nnum[];
int nCnt; char ans[];
int m,n; int getV(char a) {
if(a >= '' && a <= '') {
return a - '';
}
else if(a >= 'A' && a <= 'Z') {
return a - 'A' + ;
}
else if(a >= 'a' && a <= 'z') {
return a - 'a' + ;
} } char putV(int a) {
if(a >= && a <= ) {
return a + '';
}
else {
return a - + 'a';
}
} int div() {
int j = ds;
int ci = ;
for(int i = ds; i < de; i++) {
int ben = ci*m + tDiv[i];
tDiv[j++] = ben/n;
ci = ben%n;
}
int i = ds;
while(tDiv[i] == ) {
i++;
}
ds = i;
return ci;
} int main(int argc, char const *argv[])
{
while(scanf("%d %d",&m,&n) != EOF) {
scanf("%s",mnum);
int lenm = strlen(mnum); for(int i = ; i < lenm; i++) {
tDiv[i] = getV(mnum[i]);
} ds = , de = lenm;
tDiv[de] = -;
int j = ;
memset(nnum, , sizeof(nnum));
while(ds != de) {
nnum[j++] = div();
}
int p = ;
for(int i = j-; i >= ; i--) {
ans[p++] = putV(nnum[i]);
}
ans[p] = '\0';
puts(ans);
}
return ;
}这样,时间缩短到了30ms
但代码还有优化的空间,即数组的一位不再是一位数字,而可以是多位,这样运算次数会更少。
但比较麻烦,以后再考虑吧
九度oj 题目1080:进制转换的更多相关文章
- 九度OJ 1138:进制转换 (进制转换)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2388 解决:935 题目描述: 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 输入: 多组数据,每行为一个长度不超过30 ...
- 九度OJ题目1080:进制转换(java)使用BigInteger进行进制转换
题目描述: 将M进制的数X转换为N进制的数输出. 输入: 输入的第一行包括两个整数:M和N(2<=M,N<=36). 下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
随机推荐
- Win10微软帐户切换不回Administrator本地帐户的解决方法【亲测】
在Win10系统中经常会用到微软帐户登录,如应用商店等地方,不过一些用户反馈原来使用Administrator帐户被绑定微软帐户后无法切换回本地帐户,连[改用本地帐户登录]按钮都没有,那么怎么解决呢? ...
- win10中使用win7/win8.1"个性化"
直接下载使用: 点此下载 设置 Windows Registry Editor Version 5.00 ; ; Created by http://winaero.com, reedited by ...
- netbackup如何手动获取主机ID证书。
如何手动获取主机ID证书. 文章:100039650 最后发布:2017-09-21 评分: 20 11 产品:NetBackup 问题 从NetBackup V8.1开始,管理员需要在证书颁发 ...
- python3.6.2利用pyinstaller发布EXE
我的环境是Ubuntu 16.04,系统自带Python2和Python3 安装 pip3 install pyinstaller 发布exe pyinstaller -F helloworld.py ...
- java基础—面向对象2
一.JAVA类的定义
- 关于cocos2dx for lua资源加载优化方案
之前我写游戏加载都是从一个json文件写入要加载的文件名来实现加载,但是如果资源 比较多的情况下,会导致非常难管理,需要逐个写入.所以换了另外一种方式来加载文件. 首先,我是通过场景之前的切换时候,加 ...
- php进行文件的强制下载
浏览器下载文件,例如在浏览器中可以直接打开的文件(.gif /.txt等).在进行文件下载操作时,默认是通过浏览器直接打开,而不是下载保存文件.并且通过这种方法下载文件可以不暴漏下载文件所在的路径,可 ...
- Python + Bottle + 谷歌搜索Api 实现简单搜索引擎
1.运行环境 python3 centos7 2.Bottle的使用 使用bottle主要是因为它仅用python自带的库即可实现对web的搭建. bottle源码分析 bottle使用教程 3.代码 ...
- 用宝塔软件在linux上自动安装php环境
1.确保是纯净系统 确保是干净的操作系统,没有安装过其它环境带的Apache/Nginx/php/MySQL,否则安装不上 2.sudo进行安装 yum install -y wget &&a ...
- Goroutine 中执行匿名函数 坑
//相对应for 循环 goroutine跑到慢 所以这里很大概率只会打印最后一条数据 func goRun() { values := []int{1, 2, 3} for _, v := rang ...