九度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 的时候输入结束. 接 ...
随机推荐
- 在Office 365 添加就地保留用户邮箱
基于客户需求,要求将用户批量添加到Office 365中的现有就地保留.如您所了解的,我们可以通过Exchange在线图形用户GUI界面完成,也可以通过PowerShell完成. 要将用户批量添加到O ...
- Python中的绝对路径和相对路径
大牛们应该对路径都很了解了,这篇文章主要给像我这样的入门小白普及常识用的,啊哈 下面的路径介绍针对windows,其他平台的暂时不是很了解. 在编写的py文件中打开文件的时候经常见到下面其中路径的表达 ...
- SAP成都研究院DevOps那些事
今天的文章来自我的同事平静静,SAP成都研究院一位程序媛.平静静2010年加入SAP,熟悉她的人一般都叫她平静.在她待过的每个小组,平静静都不是最引人瞩目的开发人员,然而她总是能一如既往,保质保量地完 ...
- Windows环境下使用Apache+mod
1.安装Python和Apache. 2.安装mod_wsgi后获得wsgi.so,并将wsgi.so放到Apache的modules文件夹下. 3.安装webpy. 4.打开httpd.conf(在 ...
- caffe parse_log.sh
画loss曲线需要用到此shell脚本 #!/bin/bash # Usage parse_log.sh caffe.log # It creates the following two text f ...
- MAC OSXU盘会挂载目录
当U盘接到系统后,你可以在Terminal里输入df -lh.这时,硬盘的使用和分区情况会输出,你在Mounted on 这一列数据中可以找到你的U盘或新添加的硬盘的挂载路径.
- 点击按钮在表格的某一行下,在添加一行(HTML+JS)
使用js在指定的tr下添加一个新的一行newTr html代码: <table> <tr> <td>用户名:</td> <td><in ...
- iBatis自动生成工具Abator
https://blog.csdn.net/k_scott/article/details/8281837 ###首先创建数据库表,然后根据数据库表,生成相应的实体.及其配置文件 https://ww ...
- 禅与 Objective-C 编程艺术(Zen and the Art of the Objective-C Craftsmanship)
英文版Zen and the Art of the Objective-C Craftsmanshiphttps://github.com/objc-zen/objc-zen-book 中文版禅与 O ...
- python--以1-31的数字作为结尾的列表?论英文好的重要性!
一.python基础教程第2板(修订版)[代码清单2-1]中有一段要求打印‘以1-31的数字作为结尾的列表’ 截取代码示例:endings =['st','nd','rd'] +17*['th'] + ...