我正在编写代码以找出总数之间的差异。二进制数中的 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 int main() int n; scanf("%d",&n);整数计数,i,c;计数=0;我=1;做 c=getchar(); if(c==1) 计数++; 其他 计数--; 我++; while(i 【参考方案1】:

这显然是因为scanf("%d",&amp;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' 放在您想要这些值的代码中,而不是01

    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,使用数组的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试提高查找两个表之间差异的 Oracle SQL 的性能

使用 SIMD 找出两个元素的最大差异

SQL查询以查找列的行值之间的最小差异

整数乘法和除法之间意外的明显性能差异

无法在 wav 文件中找到 2 个声音帧之间的差异

有效地计算两个向量之间的差异