九度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 的时候输入结束. 接 ...
随机推荐
- javase基础-Helloword
public class HelloWorld {//创建一个类 :1.类名首字母需要大写:2.类名必须和文件名一致 public static void main(String[] ...
- Problem X: C语言习题 学生成绩输入和输出
Problem X: C语言习题 学生成绩输入和输出 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 4722 Solved: 2284[Submit] ...
- 修改deeplabv3的test的输出的label颜色
deeplab.py是拿来做test的,其中的postprecess函数中的palette = pascal_palette_invert()是给每个类别加颜色 这个是通过import utils获得 ...
- MySql查询时间段的方法
本文实例讲述了MySql查询时间段的方法.分享给大家供大家参考.具体方法如下: MySql查询时间段的方法未必人人都会,下面为您介绍两种MySql查询时间段的方法,供大家参考. MySql的时间字段有 ...
- C 语言设计坦克大战(未完成)
//坦克大战 //0.提示界面 //1.边框 //2.指定位置显示自己的坦克 //3.己方坦克随着方向键动起来 //getasynkeustae //Sleep(毫秒) //减少闪烁 //不闪烁Set ...
- 第1节 flume:12、flume的load_balance实现机制
1.5.flume的负载均衡load balancer 负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法.Load balancing Sink Processor 能够实现 l ...
- Java删除开头和末尾字符串
//扩展2个String方法 /* * 删除开头字符串 */ public static String trimstart(String inStr, String prefix) { if (inS ...
- python-IE浏览器调用
IE浏览器驱动添加 selenium官网有提供下载http://code.google.com/p/selenium/downloads/list 这里我用的是IEDriverServer_Win32 ...
- FMDB中的数据处理
[self.db executeUpdate:@"create table test (a text, b text, c integer, d double, e double)" ...
- webpack开始一个项目的步骤
这几天在学习Vue 用到了webpack打包工具 开始一个项目的时候 需要配置很多项 刚开始写的时候 配置文件总是缺什么再去配置什么 创建项目就用了半个小时 后来觉得应该有个步骤 这样 ...