求一个C语言程序,要求是要把输入的16进制数转换为2进制数,然后统计这个2进制数0和1的个数。今天要在线等

如题所述

#include<stdio.h>
#include<string.h>
char str[100]={0};//存放二进制数
void DecimalToBinary(int var);
main()
{
char Charnum[100]={0};//输入十六进制数
int len,i,num,cnt;
printf("输入一个十六进制数:");
scanf("%s",Charnum);
len=strlen(Charnum);
num=0;//十六进制数对应的十进制数
cnt=0;//二进制数中1的个数
for(i=0;i<=len-1;i++)
{
if(Charnum[i]>='0' && Charnum[i]<='9')
num=num*16+Charnum[i]-'0';
if(Charnum[i]>='A' && Charnum[i]<='Z')
num=num*16+Charnum[i]-'A'+10;
if(Charnum[i]>='a' && Charnum[i]<='z')
num=num*16+Charnum[i]-'a'+10;
}//将输入的十六进制转换为十进制数
DecimalToBinary(num);//调用函数将十进制数转换成二进制数
len=strlen(str);
printf("十六进制数为:%x\n",num);
printf("二进制表示为:");
for(i=len-1;i>=0;i--)
{
printf("%c",str[i]);
}
printf("\n");
while(num!=0)
{
cnt++;
num=num&(num-1);
}//统计二进制中1的个数
printf("二进制中1的个数为:%d\n",cnt);
printf("二进制中0的个数为:%d\n",len-cnt);
}
void DecimalToBinary(int var)//十进制转二进制函数
{
int i=0;
if(var==0)
{
str[0]='0';
str[1]='\0';
}
else
{
while(var!=0)
{
str[i++]=var%2+48;
var=var/2;
}
str[i]='\0';
}
}追问

这个程序好像对复杂的16进制数无效啊

追答

那试试下面这个吧,改了一下,应该没问题了
#include#include
char str[100]={0};//存放二进制数
void DecimalToBinary(int var,int a);
main()
{
char Charnum[100]={0};//输入十六进制数
int len,i,num,cnt;
printf("输入一个十六进制数:");
scanf("%s",Charnum);
len=strlen(Charnum);
num=0;//十六进制数对应的十进制数
cnt=0;//二进制数中1的个数
for(i=0;i='0' && Charnum[i]='A' && Charnum[i]='a' && Charnum[i]=0;i--)
{
printf("%c",str[i]);
}
printf("\n");
while(num!=0)
{
cnt++;
num=num&(num-1);
}//统计二进制中1的个数
printf("二进制中1的个数为:%d\n",cnt);
printf("二进制中0的个数为:%d\n",len-cnt);
}

void DecimalToBinary(int var,int a)//十进制转二进制函数
{
int i;
if(var==0)
{
str[0]='0';
str[1]='\0';
}
else
{
for(i=0;i<4*a;i++)
{
str[i]=(var&(1<<i))?'1':'0';
}
str[i]='\0';
}
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-10
#include <stdio.h>
void main()
{
int i = 0 ,sum = 0,psum=0,esum=0;
char a[100];
printf("\n 请输入一个十六进制数\n ");
scanf("%s",&a);
printf("\n 该数二进制表示如下\n ");
while( a[i] != 0 )
{
switch(a[i++])
{
case 'a': printf("1010"); psum+=2 ; esum+=2 ; break;
case 'b': printf("1011"); psum+=2 ; esum+=2 ; break;
case 'c': printf("1100"); psum+=2 ; esum+=2 ; break;
case 'd': printf("1101"); psum+=3 ; esum+=1 ; break;
case 'e': printf("1110"); psum+=3 ; esum+=1 ; break;
case 'f': printf("1111"); psum+=4 ; esum+=0 ; break;
case 'A': printf("1010"); psum+=2 ; esum+=2 ; break;
case 'B': printf("1011"); psum+=3 ; esum+=1 ; break;
case 'C': printf("1100"); psum+=2 ; esum+=2 ; break;
case 'D': printf("1101"); psum+=3 ; esum+=1 ; break;
case 'E': printf("1110"); psum+=3 ; esum+=1 ; break;
case 'F': printf("1111"); psum+=4 ; esum+=0 ; break;
case '1': printf("0001"); psum+=1 ; esum+=3 ; break;
case '2': printf("0010"); psum+=1 ; esum+=3 ; break;
case '3': printf("0011"); psum+=2 ; esum+=2 ; break;
case '4': printf("0100"); psum+=1 ; esum+=3 ; break;
case '5': printf("0101"); psum+=2 ; esum+=2 ; break;
case '6': printf("0110"); psum+=2 ; esum+=2 ; break;
case '7': printf("0111"); psum+=3 ; esum+=1 ; break;
case '8': printf("1000"); psum+=1 ; esum+=3 ; break;
case '9': printf("1001"); psum+=2 ; esum+=2 ; break;
case '0': printf("0000"); psum+=0 ; esum+=4 ; break;
}
}
printf("\n 共有%d个1 %d个0\n ",psum,esum);
}本回答被提问者采纳
第2个回答  2012-12-11
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* chang16_2(int n);
int main(void)
{
char a[100];
char b[100];
char *ptemp;
char c='0';
int len;
int n=0,sum0=0,sum1=0;
int itemp=0;
ptemp = (char*) malloc(sizeof(char[5]));
for(int i=0;i<100;i++)
{
if(i<5)
*(ptemp+i) = '\0';
a[i] = b[i] = '\0';
}
printf("请输入一个16进制数:");
scanf("%s",a);
len = sizeof(a);
for(i=0;a[i]!='\0';i++)
{
if(a[i]>='0'&&a[i]<='9')
itemp = a[i] - '0';
else if(a[i]>='A'&&a[i]<='F')
itemp = a[i] - 'A' + 10;
else if(a[i]>='a'&&a[i]<='f')
itemp = a[i] - 'a' + 10;
else
{
printf("输入16进制数错误\n");
return 0;
break;
}
ptemp = chang16_2(itemp);
if(i == 0)
{
for(int j=0;j<=3;j++)
{
if(*(ptemp+j)=='1')
break;
}
ptemp=ptemp+j;
}
for(int j=0;*(ptemp+j)!='\0';j++)
{
b[n]=*(ptemp+j);
n++;
}
}
printf("转换后的2进制数:");
for(i=0;b[i]!='\0';i++)
{
if(b[i]=='0')
sum0++;
else
sum1++;
printf("%c",b[i]);
}
printf("\n转换后的2进制数中0的个数:%d\n",sum0);
printf("转换后的2进制数中1的个数:%d\n",sum1);
return 0;
}
char* chang16_2(int n)
{
char * ptemp;
int count = 0;
ptemp = (char*) malloc(sizeof(char[5]));
for(int i=0;i<4;i++)
*(ptemp+i) = '0';
*(ptemp+4)='\0';
while(n>0)
{
for(i=3;i>=0;i--)
{
if(i==3)
*(ptemp+i)=*(ptemp+i)+1;
else if(count==1)
{
*(ptemp+i)=*(ptemp+i)+1;
count = 0;
}
if(*(ptemp+i) == '2')
{
*(ptemp+i)='0';
count = 1;
}
}
n--;
}
return ptemp;
}
试试这个
第3个回答  2012-12-10
#include <stdio.h>
#include <string.h>
void main(void)
{
char b[65];
int count[2]={0};
int hex, len, tmp;
int i, j, pos;
scanf("%x", &hex);
tmp = hex;
len = 0;
do { //计算16进制数的位数
tmp >>= 4;
len++;
} while (tmp);
for (i=0; i<len*4; i++)
{
b[i] = ( (hex>>(len*4-1-i))&1 ) + '0';
if (b[i]=='1')
count[1]++;
else
count[0]++;
}
b[i] = '\0';
printf("十六进制数:%X,二进制数:%s\n", hex, b);
printf("0:%2d, 1:%2d\n", count[0], count[1]);
}
第4个回答  2012-12-10
#include<stdio.h>
#include<string.h>
int res1,res0,a,b;
void num(int k)
{
a=0;b=0;
while(k)
{
if(k%2==1)a++;
else b++;
k=k>>1;
}
}
int main()
{
char str[100];
int i,n,k;
while((scanf("%s",str))!=EOF)
{
n=strlen(str);
for(i=0;i<n;i++)
{
if(str[i]<='9' && str[i]>='0')
k=str[i]-'0';
else k=str[i]-'A'+10;
num(k);
if(i==0)
{
res1+=a;res0+=b;
}
else
{
res1+=a;res0+=(4-a);
}
}
printf("1=%d 0=%d\n",res1,res0);
}
return 0;
}追问

我运行了一下,统计出来的01个数不对啊,并且没有显示转换后的二进制

追答

#include
#include
int res1,res0,a,b;
int ans[100],fp;
void num(int k)
{
a=0;
b=0;
while(k)
{
if(k%2==1){a++;ans[fp++]=1;}
else {b++;fp++;}
k=k>>1;
}
}
int main()
{
char str[100];
int i,n,k;
while((scanf("%s",str))!=EOF)
{
memset(ans,0,sizeof(ans));
res1=res0=0;
n=strlen(str);
for(i=n-1; i>=0; i--)
{
fp=(n-i-1)*4;
if(str[i]='0')
k=str[i]-'0';
else k=str[i]-'A'+10;
num(k);
if(i==0)
{
res1+=a;
res0+=b;
}
else
{
res1+=a;
res0+=(4-a);
}
}
for(i=fp-1;i>=0;i--)
printf("%d",ans[i]);
printf("\n1=%d 0=%d\n",res1,res0);
}
return 0;
}

//不好意思走的太急了没仔细测数据

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网