十进制数
题目描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入描述:
一个1000位(即10^999)以内的十进制数。
输出描述:
输入的十进制数的二进制逆序数。
示例1
输入
173
输出
181
代码参(chao)考(xi)的别人的,学习了
#include <stdio.h>
#include <string.h>
char ch1[1000],ch2[4000]; //ch1保存用户输入的10进制大整数,ch2保存ch1转换后的翻转的2进制
int num[1000]; //保存ch2转换的新的2进制大整数!
void Ten_two_convers(){ //十进制数转换成2进制数
int len = strlen(ch1);
int sum = 1;
int flag = 0;
int a;
int b;
while(sum){ //循环,当ch1字符数组每位都是0的时候,循环结束
b = 0;
sum = 0;
ch2[flag++] = (ch1[len-1] - '0')%2 + '0';
for(int i = 0; i < len; i++){
if(b == 0){
a = (ch1[i] - '0');
ch1[i] = a/2 + '0';
}else{
a = ch1[i] - '0' + 10;
ch1[i] = a/2 + '0';
}
if(a%2 == 0){ //此处一定是a%2,一
b = 0;
}else{
b = 1;
}
sum = sum + a/2;
}
}
}
int Two_ten(){ //2进制数转换成10进制数!!!!!!这个思路是借鉴了这种思想:比如2进制1010 =(((0*2+1)*2+0)*2+1)*2+0=10
int len2 = 1;
num[0] = 0;
for(int i = 0; i < strlen(ch2); i++){
for(int j = 0; j < len2; j++ ){ //各位循环乘2
if(j == 0){
num[j] = num[j] * 2 + ch2[i] - '0';
}else{
num[j] = num[j] * 2;
}
}
for(int j = 0; j < len2; j++){
if(j == len2 - 1&&num[len2-1] >= 10){
num[j] = num[j]%10;
num[++j] = 1; //超过10就进位
len2++; //扩大一位
}else if(num[j] >= 10){
num[j] = num[j]%10; //超过10就进位
num[j+1]++;
}
}
}
return len2;
}
int main(){
while(scanf("%s",ch1) != EOF){
memset(ch2,0, sizeof(ch2)); //将ch2清空
Ten_two_convers();
int len2 = Two_ten();
for(int i = len2-1; i >= 0; i--){
printf("%d",num[i]);
}
printf("\n");
}
return 0;
}
文章最后发布于: 2018-05-29 23:26:52
相关阅读
先说结论: 二进制文件和文本文件都是按照二进制存储的,只不过文本文件是把一个字节一个字节解读成字符,而二进制文件可以任意定义解
这里以VS2017为例子,讲解一下动态链接库(.dll)的生成与使用。一、动态链接库(.dll)的生成1、打开:“文件”-“新建”-“项目”2、打开:“
本人开始做毕设了,但老师说工具要有界面,所以就开始找python做界面的东西……之前做过C#的界面,脱拉拽很快界面就完成了,后来我查了下
一个选择恐惧症患者的字体选择 刚开始学书法的时候,真的啥都不知道,也不了解颜体和欧体,就是抱着练练字的想法去的。就是学楷书嘛,学
win7-vs2012下安装.net frame work 的过程
第一, vs和.net的对应关系大致如下vs2010----.net framework 4.0 vs2012----.net framework 4.5 vs2015----.net fram