Как определить конкретные цифры целочисленного ввода в C? - PullRequest
0 голосов
/ 15 сентября 2008

Мне нужно получить число цифр, содержащее число 1. Я знаю, что в java я могу принять ввод как String и использовать charAt, но я понимаю, что в C. нет неявной функции String. Как можно Я достигну этого?

Ответы [ 12 ]

6 голосов
/ 15 сентября 2008

Деление и модуль ваши друзья.

#include "stdio.h"

int main(){
    int digits[] = {0,0,0,0,0,0,0,0,0,0};
    int i = 11031;

    while(i > 0){
        digits[i % 10]++;
        i = i / 10;
    }

    printf("There are %d ones.\n", digits[1]);
}
1 голос
/ 16 сентября 2008

Я рассматриваю это как основную проблему понимания, которая неизбежно заставляет всех переключаться с одного языка на другой.

Хорошая справка, чтобы понять, как работает string в C, когда вы начали знакомство с java, - посмотреть, как работает string.h. В то время как в Java строки являются Object и встроены, строки в C являются просто целочисленными массивами.

Есть много учебников, один из которых мне помог, когда я начинал в начале года, был http://www.physics.drexel.edu/students/courses/Comp_Phys/General/C_basics/ взгляд на строковый раздел.

Иногда задание вопроса ускоряет процесс обучения намного быстрее, чем пролистывание учебника в течение нескольких часов подряд.

1 голос
/ 15 сентября 2008

Попробуйте что-то вроде ...

int digit = 0;
int value = 11031;

while(value > 0)
{
    digit = value % 10;
    /* Do something with digit... */
    value = value / 10;
}
1 голос
/ 15 сентября 2008

Если у вас есть только номер, то вы можете сделать это:

 int val; //Input
 ...
 int ones = 0;
 while(val != 0) {
   ones += ((val % 10) == 1) ? 1 : 0;
   val /= 10;
 }

Если у вас есть строка (char *), вы должны сделать что-то вроде этого:

while(*str != '\0') {
  if(*str++ == '1') {
    ones++;
  }
}

Стоит также отметить, что c имеет функцию charAt, в некотором смысле:

"java".charAt(i) == "c the language"[i];

Индексируя в char *, вы можете получить желаемое значение, но вы должны быть осторожны, потому что нет исключения indexOutOfBounds. Программа завершится сбоем, если вы перейдете через конец строки, или, что еще хуже, она может продолжить работать, но имеет испорченное внутреннее состояние.

1 голос
/ 15 сентября 2008

Домашнее задание

Вы прочитали бы его в char*, используя функцию fread(), а затем сохранили, сколько байтов было прочитано в отдельной переменной. Затем используйте цикл for, чтобы выполнить итерацию в буфере и подсчитать, сколько присутствует каждого байта.

0 голосов
/ 16 сентября 2008

Для всех тех, кто называет вопрос домашним заданием: я должен сказать, что большинство из вас ответили на домашнее задание.

Вы не делаете деление / модуль для получения цифр в производственном коде, во-первых, потому что он неоптимален (ваш ЦП предназначен для двоичной арифметики, а не десятичной), а во-вторых, потому что он не интуитивно понятен. Даже если изначально она не была строкой, более оптимально преобразовать ее в один и затем считать символы (std :: count - путь в C ++).

0 голосов
/ 16 сентября 2008

Это сделает это. : -)

int count_digits(int n, int d) {
  int count = 0;
  while(n*10/=10) if (n%10==d) count++
  return count;
}
0 голосов
/ 16 сентября 2008

Что-то вроде этого:

#include <stdio.h>

main() {
        char buf[100];
        char *p = buf;
        int n = 0;
        scanf("%s", buf);
        while (*p) {
                if (*p == '1') {
                        n++;
                }
                p++;
        }
        printf ("'%s' contains %i ones\n", buf, n);
}
0 голосов
/ 15 сентября 2008
int countDigit(int Number, int Digit)
{
   int counter = 0;

   do
   {
      if( (Number%10) == Digit)
      {
         counter++;
      }
   }while(Digit>0)

   return counter;
}
0 голосов
/ 15 сентября 2008

Для меня это звучит как домашнее задание. Ну что ж, это твоя жизнь.

Вы не смогли указать тип переменной, которая содержит "входное целое число". Если входное целое число является целым типом (скажем, «int»), попробуйте это:

int countOnes(int input)
{
    int result = 0;
    while(input) {
        result += ((input%10)==1);
        result /= 10;
    }
    return result;
}

Если "входное целое число" находится в строке, попробуйте это:

int countOnes(char *input)
{
    int result = 0;
    while(input && *input) {
        result += (*input++ == '1');
    }
    return result;
}

Надеюсь, это поможет. В следующий раз сделай свою домашнюю работу. И сойти с моего газона! Дети, в наши дни ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...