题目描述:

对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
    例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。

输入:

一个1000位(即10^999)以内的十进制数。

输出:

输入的十进制数的二进制逆序数。

样例输入:
173
样例输出:
181

初看此题,本以为是一道水题。但仔细一看是1000位的整数,难度瞬间提高了好几个档次。
没办法,用处理长整数的办法解题吧!
 #include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#define MAX 1009
#define inf 1000000009
#define BASE 4
char temp[MAX];
int src[];
int des[];
int tmp[]; int div(int toD[], int len) {
if(len == ) {
toD[] = toD[]/;
return len;
} int ci = toD[len-];
int j = ;
for(int i = len-; i >= ; i--) {
int q = ci * + toD[i];
int p = q/;
ci = q%;
tmp[j] = p;
j++;
}
int t = ;
for(int v = j-; v >= ; v--) {
toD[t++] = tmp[v];
} int p = tmp[] / ;
int q = tmp[] % ;
toD[t++] = q;
if(p != ) {
toD[t++] = p;
} return t;
} int mul2(int toM[], int len) {
int ci = ;
for(int i = ; i < len; i++) {
int p = toM[i] * + ci;
int q = p % ;
ci = p/;
toM[i] = q;
}
if(ci != ) {
toM[len] = ci;
len++;
} return len;
} int inc(int toM[], int len) {
int ci = ;
for(int i = ; i < len; i++) {
int p = toM[i] + + ci;
int q = p % ;
ci = p/;
toM[i] = q;
if(ci == ) {
return len;
}
}
toM[len] = ci;
len++;
return len;
} int main(int argc, char const *argv[])
{ //freopen("input.txt","r",stdin);
while(scanf("%s",temp) != EOF) {
int k = ;
memset(src, , sizeof(src));
int i = strlen(temp)-;
for(;i > BASE-; i = i-BASE) {
for(int j = i - BASE+; j <= i; j++) {
src[k] = * src[k] + (temp[j] - '');
}
k++;
}
for(int j = ; j <= i; j++) {
src[k] = * src[k] + (temp[j] - '');
}
k++;
/*for(int i = k-1; i >= 0; i--) {
printf("%04d",src[i]);
}
printf("\n");*/
memset(des, , sizeof(des));
int lend = ;
while(true) {
if((src[]& )== ) {
//des = des * 2;
lend = mul2(des, lend);
//printf("0");
}
else {
//des = des * 2 + 1;
lend = mul2(des, lend);
lend = inc(des,lend);
//printf("1");
} k = div(src, k); /*for(int i = k-1; i >= 0; i--) {
printf("%04d",src[i]);
}
printf("\n");*/ if(k == && src[] == ) {
break;
}
}
//printf("\n");
printf("%d",des[lend-]);
for(int i = lend-; i >= ; i--) {
printf("%04d",des[i]);
}
printf("\n");
}
return ;
}

代码先将输入的字符串转化为4个一单位的整数数组,之后模拟了整数的除法和乘2操作以及加1操作。

代码提交了两次才通过。原因是第一次在处理除法时偷懒,使最高位可以大于4位,导致错误

九度oj 题目1208:10进制 VS 2进制的更多相关文章

  1. 九度OJ题目1208:10进制 VS 2进制 (JAVA)

    题目描述: 对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数.     例如对于十进制数173,它的二进制形式为10101101,逆序排列得到1 ...

  2. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  6. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  7. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  8. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  9. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

随机推荐

  1. bootstrap警告框、进度条和列表组

    警告框   <div class="container">      <div class="alert alert-success" rol ...

  2. ios 自定义加载动画效果

    在开发过程中,可能会遇到各种不同的场景需要等待加载成功后才能显示数据.以下是自定义的一个动画加载view效果.      在UIViewController的中加载等到效果,如下 - (void)vi ...

  3. AzureARM 使用 powershell 扩容系统磁盘大小

    azure中的虚拟机,windows磁盘大小为127G,linux磁盘大小为30G,在很多时候部署应用程序时直接部署到系统磁盘内导致磁盘后期容量不够需要扩容,在执行分区扩容前我们需要先通过Potal或 ...

  4. sql service 查询分析数据库

    --学会通配符 https://blog.csdn.net/blackfwhite/article/details/80382849 --学会变量中的变量 https://www.cnblogs.co ...

  5. 在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个。必须提供所有成员。 (microsoft.sqlserver.smo)

    问题:在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个.必须提供所有成员. (micro ...

  6. shell 复合条件测试 if [ $1 == "1" -o $1 == "0" ] ------==和-eq怎么用

    想要实现: ”,或者$1等于“” ];then 输出一些东西 ”,或者$1等于“” ];then 输出一些东西 fi 这里比较难操作的是等于和或者: 等于: -eq  或者 == 或者: -o 见: ...

  7. 高精度A+B

    #include<stdio.h> #include<string.h> int main() { int lenth1,lenth2,n,i,j,k,s; scanf(&qu ...

  8. Linux部署多个tomcat

    Linux部署多个tomcat 1.环境:1.1. Centos 5.01.2.Tomcat 5.5.17 2.需要解决一下几个问题2.1.不同的tomcat启动和关闭监听不同的端口2.2.不同的to ...

  9. VC-基础:关于一些符号的意义

    GUI应用程序:Graphic User Interface图形 用户 接口 SDI:单文档程序(典型的记事本就是SDI) MID:多文档程序(比如VS2008默认就是多文档的)

  10. nyoj-47-过河问题|POJ-1700-Crossing River

    http://acm.nyist.net/JudgeOnline/problem.php?pid=47 http://poj.org/problem?id=1700 解题思路:求最少需要多少时间才能都 ...