九度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 的时候输入结束. 接 ...
随机推荐
- Windows7(x86) xampp php5.5 imagick install
I hate windows. 1. 下载安装 ImageMagick, 选择合适您电脑的版本,我下载的是: ImageMagick-6.8.9-1-Q16-x86-dll.exe http://ww ...
- MVC的验证码
后台: /// <summary> /// 创建验证码的图片 /// </summary> /// <param name="validateCode" ...
- 【转】实用API大全
有道翻译APIhttp://fanyi.youdao.com/openapi有道翻译API支持中英互译,同时获得有道翻译结果和有道词典结果(可能没有),返回格式为XML或JSON. 百度翻译APIht ...
- 关于java字符串常量池
今天发现一个好玩的东西 public static void main(String[] args) { String str1 = new StringBuilder(" ...
- UITableView上添加按钮,按钮点击效果延迟的解决办法
在自定义的TableView的初始化方法做如下操作 - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame: ...
- iOS下的2D仿射变换机制(CGAffineTransform相关)
仿射变换简介 仿射变换源于CoreGraphics框架,主要作用是绘制2D级别的图层,几乎所有iOS设备屏幕上的界面元素都是由CoreGraphics来负责绘制.而我们要了解的2D仿射变换是其下负责二 ...
- JavaScript中数组的使用
---恢复内容开始--- 创建数组 1,通过 var arr1 = [1,2,3] 2通过使用 var arr2 = new Array(1,2,3) 在这里创造的数组实际上都是一个对象,然后把对象的 ...
- 控件中添加的成员变量value和control的区别
control型变量是这个控件所属类的一个实例(对象)可以通过这个变量来对该控件进行一些设置.而value只是用来传递数据,不能对控件进行其它的操作.control型变量可以获得控件的实例,通过这个变 ...
- 重温经典之赫夫曼(Huffman)编码
先看看赫夫曼树假设有n个权值{w1,w2,…,wn},构造一个有n个叶子结点的二叉树,每个叶子结点权值为wi,则其中带权路径长度WPL最小的二叉树称作赫夫曼树或最优二叉树. 赫夫曼树的构造,赫夫曼最早 ...
- mysql中的的按小数位截取
format()函数返回类型是字符串,满三位会加一个逗号. 针对数字类型转换建议使用 convert或者cast函数,用法如下: format(param, 2) (不建议) convert(para ...