0

所以我正在尝试制作一个更小的简单程序来解决问题。为此,我试图检查以确保用户输入了一个仅包含 1 和 0 的数字,然后我将使用该数字进行除法。例如数字 11010 或 10111。现在我的问题是,如果我声明一个整数来存储这个数字(如下),就没有办法检查所有数字是 1 还是 0,对吗?

int userInput;

现在,我可以为此使用一个数组。(我知道怎么做,但这导致了我的第二个问题。)。像这样:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main (int argc, char *argv[]){
    int myArray[20];
    int i, input, length;
    printf("Please enter how long your number is: \n");
    scanf("%d", &length);
    for (i = 0; i < length; i++){
        printf("Please enter digit %d of your array\n", i+1);
        scanf("%d", &input);
        assert ((input == 1) || (input ==0));


    }

例如,对于第一个数字用户输入“1”,用户输入第二个数字“0”,然后用户输入第三个数字“0”。我需要“抓住”这个数字。我将如何抓住这个数字“100”并对其进行算术运算。我希望这是有道理的,如果不是版主,请给我一个机会来澄清它。

编辑:许多人建议采用模数方法。但我仍然想知道我是否可以用数组来做到这一点。那就是创建一个整数变量并将其设置为等于用户在数组中输入的每个元素。

4

6 回答 6

1

你真的不需要一次得到一个数字。

提取int的数字很容易。请注意,像 12345 这样的数字实际上是 5 * 10^0 + 4 * 10^1 + 3 * 10^2 + 2 * 10^3 + 1 * 10^4。

要获得最低位,您可以只取除以 10 的余数(即使用 % 运算符将其除以 10)。所以,12345 % 10 是 5。要获得下一个数字,您可以将数字除以 10(得到 1234),然后再除以 10 - 给您 4。只要数字中还有数字(即数字> 0)。

#include <stdio.h>


int is_valid(int number) {
  if (number == 0) return 1; // its a 0.
  while (number != 0) {
    int digit = number % 10;
    if (digit != 1 && digit != 0) return 0;
    number = number / 10;
  }
  return 1; // no other digits were found.
}

int main() {
  int n;
  scanf("%d", &n);
  if (is_valid(n)) printf("valid\n");
  else printf("not valid\n");
  return 0;
}

这是另一个想法:

只需将数字再次写入字符串即可。然后遍历字符串检查每个字符。这效率有点低,但更容易理解/编码。

#include <stdio.h>

int is_valid(int n) {
  char buffer[20];
  char *c;
  sprintf(buffer, "%d", n);
  for(c = buffer; *c != '\0'; c++) {
    if (*c != '0' && *c != '1') return 0;
  }
  return 1;
}

int main() {
  int n;
  scanf("%d", &n);
  if (is_valid(n)) printf("valid\n");
  else printf("not valid\n");
  return 0;
}

编辑:由于您在编辑中提到您对替代方法不感兴趣,只需要一种在输入数字时“抓取”数字的方法,因此我将其添加到我的答案中。

保持一个变量最初设置为 0。现在随着每个数字的输入,(我假设用户在输入较低的数字之前输入较高的数字),我们将变量乘以 10 并将新数字添加到它。因此,如果用户输入 1, 0, 0,我们的变量最初是 0,然后是 1 (0 * 10 + 1),然后是 10 (1*10 + 0),最后是 100 (10 * 10 + 0),这正是我们所需要的。

于 2013-08-03T14:06:59.797 回答
1

我认为这可能更简单:

bool is_zeros_and_ones(int n) {
  for (; n != 0; n /= 10) {
    int mod = n % 10;
    if (0 != mod && 1 != mod) {
      return false;
  }
  return true;
}

因此,您可以输入整数并在没有数组的情况下对其进行测试。

于 2013-08-03T14:09:08.460 回答
0

此解决方案仅适用于问题的第二部分。您可以将输入作为字符并用于atoi将它们转换为整数。

char arrayOfNumbers[MAX_LENGTH];
char tmpChar;
int number;
for (i = 0; i < length; i++){
    printf("Please enter digit %d of your array\n", i+1);
    scanf("%c", &tmpChar);
    assert ((tmpChar == '1') || (tmpChar == '0'));
    arrayOfNumbers[i] = tmpChar;
}

/*make sure it is NULL terminated*/
arrayOfNumbers[length] = '\0';
number = atoi(arrayOfNumbers);
于 2013-08-03T20:11:28.960 回答
0

您可以通过确保程序始终处理整数来欺骗自己。您的数组基本上包含以 10 为基数的二进制表示。为什么不使用它转换为int. 然后,您可以将所有操作应用于该数字,就像您对 进行操作一样ints

这就是我的意思

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main (int argc, char *argv[]){
    int i, input, length;
    int num = 0; /* holds the actual number */


    printf("Please enter how long your number is <= %d: \n", 8 * sizeof(num) - 1);
    scanf("%d", &length);
    for (i = 0; i < length; i++){
        printf("Please enter digit %d of your array\n", i+1);
        scanf("%d", &input);
        assert ((input == 1) || (input ==0));
        /* humans enter numbers L TO R */
        /* set that bit if it is one */
        num |= (input << (length - i - 1)) ;
    }

    printf("Your number in base 10 is %d\n",num); 
    /* Now you do normal multiplications, additions, divisions */
    /* The only thing remaining now is to convert from base 10 to base 2. */
}

Sample run
Please enter how long your number is <= 31: 
5
Please enter digit 1 of your array
1
Please enter digit 2 of your array
1
Please enter digit 3 of your array
1
Please enter digit 4 of your array
1
Please enter digit 5 of your array
0
Your number in base 10 is 30
于 2013-08-03T20:00:34.517 回答
0

您不需要数组来存储所有数字。

继续除以 10 并取模以获取每个数字并保留一个标志来标记所有数字是 1 还是 0。

当然仅适用于整数的最大字长...

就像是:

char isBinary = 1;

int copyInput = +input;

while(copyInput  && (isBinary=copyInput%10<=1)) copyInput/=10;
于 2013-08-03T14:07:09.613 回答
0

也许这样的事情就足够了

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main (int argc, char *argv[]){
    int myArray[21];
    printf("Please enter your number (max 20 digits)\n");
    scanf("%s", myArray);
    for (i = 0; i < strlen(myArray); i++){
        assert ((myArray[i] == 1) || (myArray[i] == 0));
    }
于 2013-08-03T14:10:00.940 回答