64-битный длинный целочисленный параметр - PullRequest
0 голосов
/ 31 октября 2018

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

Любое предложение или помощь? Спасибо.

Мой код:

/**
 * Create a function called count that takes a 64 bit long integer parameter (n)
 * and another integer pointer (lr) and counts the number of 1 bits in n and
 * returns the count, make it also keep track of the largest run of
 * consecutive 1 bits and put that value in the integer pointed to by lr.
 * Hint: (n & (1UL<<i)) is non-zero when bit i in number n is set (i.e. a 1 bit)
 */


/* 1 point */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int count (uint64_t n)
{       
  int ret = 0;
  long x = n;
  if (x < 0)
    x = -x;
  while (x != 0)
    {
      ret += x % 2;
      x /= 2;
    }
  return ret;     //done summing when n is zero.
}

/**
 * Complete main below and use the above function to get the count of 1 bits
 * in the number passed to the program as the first command line parameter.
 * If no command line parameter is provided, print the usage:
 *   "Usage: p3 <int>\n"
 * Hints:
 * - Use atoll to get a long long (64 bit) integer from the string.
 * - Remember to use & when passing the integer that will store the longest
 *   run when calling the count function.
 *
 * Example input/output:
 * ./p3 -1
 * count = 64, largest run = 64
 * ./p3 345897345532
 * count = 17, largest run = 7
 */
int main (int argc, char *argv[])
{
  if (argc < 2)
    {
      printf ("Usage: p3 <int>\n");
    }
  int n = atoll(argv[1])
  printf("count = %d, largest run = %d\n", n, count(n));

}

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

Ответы [ 2 ]

0 голосов
/ 31 октября 2018
  1. использовать atoll получить int64_t от argv[1]
  2. использовать (n&(1UL<<i)) определить каждый бит 1 или 0
  3. использовать переменную для записи текущего количества последовательных битов

объяснить:

temp означает текущий последовательный счетчик в 1 бит

  1. если n&(1UL<<i) == 1, текущий бит равен 1, поэтому текущий последовательный 1 бит добавляет 1, поэтому ++temp;

  2. , если n&(1UL<<i) == 0, текущий бит равен 0, поэтому число последовательных 1 битов равно 0, поэтому temp = 0;

Может работать следующее code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int count(int64_t n, int* lr) {
    *lr = 0;

    int temp = 0;
    int ret  = 0;

    for (int i = 0; i != 64; ++i) {
        if (n&(1UL<<i)) {
            ++ret;
            ++temp;
            if (temp > *lr)
                *lr = temp;
        } else {
            temp = 0;
        }
    }
    return ret;
}

int main (int argc, char *argv[]) {
    if (argc != 2) {
        printf ("Usage: p3 <int>\n");
        return -1;
    }

    int64_t n = atoll(argv[1]);
    int k;

    int sum = count(n, &k);

    printf("count = %d, largest run = %d\n", sum, k);

    return 0;
}
0 голосов
/ 31 октября 2018

То, что вы опубликовали, приводит к ошибке компиляции:

main.c:52:44: error: ‘n’ undeclared (first use in this function)
   printf("count = %d, largest run = %d\n", n, count(n));
                                            ^

Как показывают комментарии в вашем коде, вам нужно добавить следующую строку:

int n = n = atoll(argv[1]);

Измените вашу main функцию, чтобы она выглядела примерно так:

int main (int argc, char *argv[])
{
    if(argc < 2)
    {
        printf ("Usage: p3 <int>\n");
    }
    else
    {
        int n = atoll(argv[1]);
        printf("count = %d, largest run = %d\n", n, count(n));
    }

    return 0;
}

Если ваша count функция должна return число 1 битов в n, ваша реализация не будет работать. Измените тело while на следующее:

ret += x % 2;
x /= 2;
...