问题 B: Hz的进制
时间限制: 1 Sec 内存限制: 128 MB提交: 20 解决: 14
[ 提交][ 状态][ 讨论版]
题目描述
输入
输出
样例输入
1
-5
样例输出
1
31
提示
代码一:
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n,i,j,s,a[35];
while(~scanf("%d",&n))
{
s=0;
if(n>=0)
{
while(n)//当n为正整数时直接计算
{
if(n%2==1)
s++;
n=n/2;
}
}
else
{
i=0;
n=fabs(n);//取绝对值
while(n)
{
a[i]=n%2;
n/=2;
i++;//转化为二进制保存
}
s=32-i;//减掉二进制中正数为一时后面的数的个数
for(j=0;j<i;j++)
{
if(a[j]==1)
a[j]=0;
else
a[j]=1;
}//取反,只取反正数为一时后面的数
a[0]=a[0]+1;//加一
for(j=0;j<i;j++)
{
a[j+1]=a[j+1]+a[j]/2;
a[j]=a[j]%2;
}//二进制进位
for(j=0;j<i;j++)
{
if(a[j]==1)
s++;
}//计算一的个数
}
printf("%d\n",s);
}
return 0;
}
代码二:
注释:在此种情况下,先进行0的个数的计算,再用32-sum比较简单,当最后一位为0时,它取反后要考虑进位的问题。
最后一位:0——>1——>1+1——>0;
前一位:如果还是一还要考虑进位0——>1——>1+1——>0;
此时需要计算0的个数;(if(n%2==0&&flag==0) sum++;)
而当这一位值为1(if(n%2==1) flag=1;)时
进行计算一的个数:1——>0——>0,即为计算0的个数;(if(flag==1&&n%2==1) sum++;)
最后在32-sum即可。
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int main()
{
int n,sum,flag;
while(~scanf("%d",&n))//多组测试
{
sum=0;
flag=0;
if(n>=0)//n》=0的情况下不进行取反加一
{
while(n)
{
if(n%2==1)
sum++;//计算一的个数
n=n/2;
}
printf("%d\n",sum);
}
else
{
n=-n;//变为正数
while(n)//注释
{
if(n%2==0&&flag==0)
sum++;
if(flag==1&&n%2==1)
sum++;
if(n%2==1)
flag=1;
n=n/2;
}
printf("%d\n",32-sum);
}
}
return 0;
}