题目描述
给一个整数n,数出该数本身1的个数和转化成二进制后1的个数。
输入
输入一个整数n,n=-1结束;
输出
所有1的个数sum;
样例输入
11
8
-1
样例输出
5
1
#include<stdio.h>
#include<string.h>
int main()
{
char str[100];//为了防止大数, 以字符串的形式输入
int num[1000], num2[1000]; //一个数组存放输入的十进制数, 另一个存放二进制数
while (scanf("%s", str)!=EOF)
{
if (str[0] == '-' && str[1] == '1' && strlen(str) == 2)//当等于-1时结束
break;
int flat = 0;
if (str[0] == '-')//判断是否是负数
flat=1;
int sum = 0;
int i, j, k=0;
memset(num, 0, sizeof(num));
for (i = flat; i < strlen(str); i++)//将字符串存入数组中并找到1的个数
{
num[i] = str[i] - '0';
if (str[i] == '1')
sum++;
}
int count=1;
while (count)//当二进制转化完成后结束
{
count = 0;
for ( i = flat; i < strlen(str); i++)// 模拟除法, 更新每次除以二后的数组, 并将余数存入数组
{
int d = num[i] / 2;
count += d;
if (i == (strlen(str) - 1))
{
num2[k++] = num[i] % 2;
}
else
num[i + 1] += (num[i] % 2) * 10;
num[i] = d;
}
}
for (i = k - 1; i >= 0; i--)//找出二进制中1的个数
{
if (num2[i] == 1)
sum++;
}
printf("%d\n", sum);
}
}