九度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 的时候输入结束. 接 ...
随机推荐
- vmware 虚机NAT模式,局域网可访问
本地VMware虚拟机,网络模式为NAT,现在需要局域网其他电脑通过ssh连接这台VMware虚拟机 宿主机地址:192.168.3.26 VMware虚拟机地址:192.168.239.137 局域 ...
- 洛谷 P1426 小鱼会有危险吗
题目描述 有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%.有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是 ...
- python基础教程总结1——列表和元组
1.序列 python含有6种内建序列——列表,元组,字符串,Unicode字符串,buffer对象,xrange对象 2.通用序列操作 2.1 索引 注: input()根据用户输入变换相应的类 ...
- [dp][uestc]L - 菲波拉契数制升级版
数据很大,以背包的思路数组开不下. 先定序地考虑一个菲波拉契数如fib(i)的表示法,假设i比较大,由菲波拉契数的定义可知道fib(i)=fib(i-1)+fib(i-2);要找到其它表示就继续拆分f ...
- UI的组织形式
UI的组织形式是树状结构: 根据层次的不同分为叶子节点和干节点. 叶子节点负责简单的信息展示. 复杂的主干复杂叶子节点的组织和整体展示. http://www.cnblogs.com/feng9exe ...
- Predicate和Consumer接口的使用
// Predicate 判断是否拥有资格,Consumer 改变输入的值 案例 public static MyTest2 getV(MyTest2 a, Predicate<MyTe ...
- Django 的母板及布局(Bootstrap)
title: Django 的母板及布局(Bootstrap) tags: Django --- Django 的母板及布局(Bootstrap) Django 的母板是作为公共的部分,其他的页面都能 ...
- Sublime +Markdown+OmniMarkupPreviewer 搭建实时预览的markdown编辑器
浏览器实时预览 <meta http-equiv="refresh" content="0.1"> auto save 的配置 {"aut ...
- 使用jquery-validate校验表单
注意: 表单校验(validation校验[需要下载JQuery-validate插件,而且必须要在引入JQuery插件之后,再引入validate插件/*validate是建立在JQuery之上*/ ...
- SCOPE_IDENTITY和@@IDENTITY[转]
本文转自:http://www.cnblogs.com/daydayupanan/archive/2008/09/04/1283648.html SCOPE_IDENTITY和@@IDENTITY的作 ...