我正在编写代码以找出总数之间的差异。二进制数中的 1 和 0,使用数组
Posted
技术标签:
【中文标题】我正在编写代码以找出总数之间的差异。二进制数中的 1 和 0,使用数组【英文标题】:I am writing a code to find out the difference between the total no. of 1s and 0s in a binary number, using Arrays 【发布时间】:2021-03-08 06:57:14 【问题描述】:我的输入是,比如说,
4
1100
这里的'4'是数组的位数。
我想让它扫描 arr[0]=1, arr[1]=1, arr[2]=0, arr[3]=0
但它正在扫描 arr[0]=1100 然后是随机垃圾。 如何解决这个问题?
随机垃圾的含义,arr[1]=-1627,arr[2]=66 和任何随机的东西。不过我很确定,我的其余代码是正确的。
#include <stdio.h>
int main()
int n,i,t,chk1,chk0,fin;
scanf("%1d",&n);
int arr[n];
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
i=0;
chk1=0;
chk0=0;
do
if(arr[i]==0)
chk0=chk0+1;
else
chk1=chk1+1;
i++;
while(i<n);
if(chk1>chk0)
fin=chk1-chk0;
else if(chk1<chk0)
fin=chk0-chk1;
else
fin=0;
printf("%d",fin);
return 0;
【问题讨论】:
我看不出在这里使用数组的意义。只需将int
计数器设置为零,然后一次读取一个字符(例如,使用getchar()
)。每当此字符等于1
时,计数器就会增加,每次此字符等于0
时,计数器就会减少。
为什么不将二进制数存储为二进制?而不是“十进制编码二进制”或任何这种格式。
@r3mainer,我刚试过,但没用。
#include 这显然是因为scanf("%d",&arr[i])
读出了整数。对于scanf
,1100 是一个整数。因此在这个循环的第一次迭代之后:
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
arr[0]
等于 1100。
【讨论】:
是的,我明白了,但是解决办法是什么? @obsidian 你可以使用std::cin.get()。看看这个,希望对你有帮助【参考方案2】:您在 cmets 中发布的代码非常接近正确的解决方案。只有两个问题:
c=getchar(); if(c==1) /* ... */
getchar()
的返回值——正如你所料——是一个字符。如果你的输入包含字符'1'
,那么getchar()
不会返回值1,而是这个字符对应的ASCII值,恰好是49。字符'0'
的ASCII值是48。但是您不需要记住这些值,只需将'0'
和'1'
放在您想要这些值的代码中,而不是0
和1
。
else count--;
这一行假设getchar()
将看到的唯一字符是'0'
和'1'
。但是,您可能会发现在调用scanf()
之后,输入缓冲区中仍然会有一个换行符在等待您。您可以在 while()
循环之前插入对 getchar()
的额外调用以清除此字符,或者在循环内显式检查 '0'
和 '1'
。
这是您的代码的固定版本。我去掉了变量i
,因为你还不如使用n
来计算输入数字。
#include <stdio.h>
int main()
int n, c, count=0;
scanf("%d",&n);
while (n > 0)
c = getchar();
if (c == '1')
count++;
n--;
else if (c == '0')
count--;
n--;
printf("%d\n", count);
return 0;
【讨论】:
以上是关于我正在编写代码以找出总数之间的差异。二进制数中的 1 和 0,使用数组的主要内容,如果未能解决你的问题,请参考以下文章