题解 P1100 【高低位交换】
这个题目主要是考察进制的转换
各位大佬都是用的左移,右移,而我,只是利用的简单的进制转换。希望本蒟蒻能帮助到各位。
上面那个是10进制转2进制的一个算法
由于没找到2进制转10进制的图片,我就说一下样例吧。
1314520 //十进制
101000000111011011000 //二进制
利用2^n(n为从右往左数第几位),最右边的第一位n的值为0
所以
2^00+2^10+2^20+2^31+2^41+2^50……+2^31*1
=8+16+64+128+512+1024+2048+262144+1048576
=1314520
我就是利用这种方法,把二进制转为十进制的。
接下来直接上代码吧:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int x,y,a[101],b[101],len;
long long ans; //2^31,已经能够超过int范围(2^31 -1)
void two(int n) //由十进制转换为2进制
{
while (n!=0)
{
len++;
a[len]=n%2; //取余,这是十进制转二进制的一个算法
n/=2;
}
}
void ten(int b[]) //由二进制转回十进制
{
int temp=31;
for (int i=1;i<=32;i++)
{
ans+=b[i]*pow(2,temp); //利用2^n来累加,得出答案
temp--;
}
}
int main(){
cin>>x; //输入
two(x); //转为二进制
int temp=16,temp1=32;
for (int i=1;i<=32;i++) //因为由二进制转化过来时是逆序的。所以这一块可能有些复杂。
{
if (i<=16)
{
b[i]=a[temp]; //32位转换一下
temp--;
}
if (i>16)
{
b[i]=a[temp1];
temp1--;
}
}
ten(b); //转回十进制
cout<<ans<<endl; //输出答案
return 0;
}
希望在你看完这篇题解后能学到点什么