Как посчитать число единиц в строке
Перейти к содержимому

Как посчитать число единиц в строке

  • автор:

Как посчитать число единиц в строке

Argument ‘Topic id’ is null or empty

Сейчас на форуме

© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru

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

ООО «Планета Эксел»
ИНН 7735603520
ОГРН 1147746834949
ИП Павлов Николай Владимирович
ИНН 633015842586
ОГРНИП 310633031600071

Как посчитать число единиц в строке

Сыну задали задачу — на чистом С получить для русского алфавита в ANSI и UNICODE кодировке таблицу: символ — битовое представление — количестов единиц в битовом представлении. Взялся ему помочь, но что-то не получилось.
char *p, bukv[1];
p = malloc(nbukv);
for(i=0;i bukv[0] = ‘\0’;
strncat(bukv, p, 1);
>> вот здесь хотелось бы обрабатывать bukv
p++;
>
Подскажите, пожалуйста, как решить эту задачу.

Сообщение отредактировано: tumanovalex — 21.09.08, 17:31
Сообщ. #2 , 21.09.08, 18:13

Senior Member
Рейтинг (т): 63
Для начала неплохо самому представить, что надо сделать. Код только какойто странный.
char *p, bukv[1];//Здесь точно ничего не напутали?
p = malloc(nbukv);//Не мало ли?
for(i=0; iНасчет русского алфавита — хм, в какой кодировке? Чтото сказали про UNICODE на чистом C(Имхо, юникодом и на «чистых» плюсах не пахнет)?

Сообщ. #3 , 21.09.08, 18:23
Рейтинг (т): нет
сдвига я не знаю
но можно сделать так
int a=100 ; //к примеру это входное число (код буквы)
int b=(a%2)+(a%4)+(a%8)+(a%16)+(a%32)+(a%64)+(a%128)+(a%256) // а это количество единиц

напоминаю операция % вычисление остатка от деления .Мож кто забыл

Добавлено 21.09.08, 18:25
сори там надо более хитроумное придумать с этим

Добавлено 21.09.08, 18:31
в цикле и с условием.

Сообщ. #4 , 21.09.08, 18:49
Рейтинг (т): 2

Пока хотелось бы решить задачу хотя бы для ANSI. Строка считывается из файла (для возможности ввода любого текста) в массив p, nbukv — количество символов в строке. p++ для того, чтобы передвигаться в строке, а bukv[1] для выделенного из строки символа. Может быть можно что-нибудь придумать получше и красивее, но так точно работает. Без bukv[0] = ‘\0’; получается ерунда. Чистый С подразумевает все остальное, кроме специфичных для Unicode функций (без С++). Может быть лучше мне было задать этот вопрос в Win32?

Сообщ. #5 , 21.09.08, 18:53
Рейтинг (т): 134
ИМХО лучшим вариантом подсчета единичных бит является алгоритм «разделяй и властвуй»
// для 16-х битных слов
int NumOfBits(unsigned int x) < x = x - ((x >> 1) & 0x5555);
x = (x + (x >> 4)) & 0x0f0f;

Не проверял, но по идее должно работать А уж преобразовать число в строку его бинарного представления думаю сам справишься.

две очепятки нашел. исправил

Сообщение отредактировано: AndNot — 21.09.08, 19:27
Сообщ. #6 , 22.09.08, 12:11
Рейтинг (т): 61

В принципе, все легко делается для обоих случаев.
Идешь по символам(просто индексируешь строку, в этом случае не нужно самому заботится о количесве байтов в ANSI и Unicode), каждый символ разбиваешь на байты(в случае ANSI у тебя будет один байт) или заводишь указатель на байт(char) и сравниваешь его значение с адресом следующего элемента строки, выполняешь подсчет единиц для каждого байта, складываешь — получаешь число единиц в конкретном символе.
Это общее решения для двух таблиц. Если бы ты на С++ писал, можно было бы и зашаблонить. А так можно или дефайн или копипаст.

Сообщ. #7 , 22.09.08, 12:40

Рейтинг (т): 231
можно табличкой))
unsigned bits [] = <0,1,1,2,1,2,2,3,1, 2,2,3,2,3,3,4,1,2,2,3,2,3,3,4, 2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,2,3, 3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5, 4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4, 4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4, 4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3, 2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4, 4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5, 3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5, 5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,4,4,5, 4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6, 6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,>;
unsigned char c = ‘Б’;
std::cout << bits[c] << " " << unsigned (c);

Добавлено 22.09.08, 12:42
для юникода
bits[unsigned char ( c )] + bits[unsigned char (c >> 8)];

Сообщение отредактировано: LuckLess — 22.09.08, 13:04
Сообщ. #8 , 22.09.08, 12:50

Рейтинг (т): 150
int b=(a%2)+(a%4)+(a%8)+(a%16)+(a%32)+(a%64)+(a%128)+(a%256) // а это количество единиц

Скорре уж так
int b=(a&1)+(a&2)+(a&4)+(a&8)+(a&16)+(a&32)+(a&64)+(a&128)+(a&256) // а это количество единиц
Сообщение отредактировано: Hsilgos — 22.09.08, 13:19
Сообщ. #9 , 22.09.08, 12:55

Рейтинг (т): 506
Цитата Hsilgos @ 22.09.08, 12:50
Скорре уж так

Боюсь, что ни так, ни так не получится.
Сообщ. #10 , 22.09.08, 12:59
Рейтинг (т): 74
c 256 эндить не стоит
Сообщ. #11 , 22.09.08, 13:04

Рейтинг (т): 150
Боюсь, что ни так, ни так не получится.
Сообщ. #12 , 22.09.08, 13:05

Рейтинг (т): 231
Цитата Hsilgos @ 22.09.08, 12:50

Что ж ты так юникод не лубиш?

Добавлено 22.09.08, 13:05
да. с 256 перебрали малость

Сообщ. #13 , 22.09.08, 13:08
Рейтинг (т): 2

В конце концов я остановился на таком варианте (пока ANSI, дальше буду думать по поводу общей программы для ANSI и UNICODE):

while(!feof(pfile)) < c = fgetc(pfile); //CharToOem(c, c); printf("%c\t%i\t%-s\t\t%i\n", c, __toascii(c), _itoa(__toascii(c),s,2), get_bit_8(c)); short get_bit_8(char Data) < // авторство этой функции не помню, нашел в каком-то форуме unsigned short Mask = 0x80, Res=0, i; for (i = 0; i < 8; i++) < return Res;

Хотелось бы получить ответы на следующие вопросы:
1.Как перевести символ из CharToOem, чтобы на экране в консольном приложении видеть нормальные буквы (в документированной строке ошибка, как правильно сделать, я не знаю)?
2. Можно ли вместо __toascii© использовать какую-нибудь другую функцию, более современную (когда я делал без нее,_itoa давала ерунду)?
3. Как сделать так, чтобы в результате действия _itoa на экран выводились бы все входящие в двоичное представление нули? Сейчас для пробела (код 32) выводится 100000, выравнивание по левому краю (теряются нули слева и справа и для других символов);
4. При считывании из файла считывается, видимо, и символ конца файла (11111111). Можно ли так модифицировать кусок кода, чтобы он на печать не выводился?

Python-сообщество

[RSS Feed]

  • Начало
  • » Центр помощи
  • » Подсчитать количество нулей и единиц

#1 Июнь 6, 2017 14:11:11

Sergava Зарегистрирован: 2017-06-06 Сообщения: 5 Репутация: 0 Профиль Отправить e-mail

Подсчитать количество нулей и единиц

Привет) Я начал изучать Python недавно, поэтому мне нужна помощь.
мой код:

from random import randint as r while 1: x = int(input('\nкол-во: ')) for i in range(x): print(r(0,1),end='') 

Как посчитать количество нулей і единиц в строке, что выведется?
Чтобы конечный результат был такой:
Нулей: x
Единиц: y

#2 Июнь 6, 2017 14:40:03

FishHook От: Зарегистрирован: 2011-01-08 Сообщения: 8312 Репутация: 568 Профиль Отправить e-mail

Подсчитать количество нулей и единиц

Sergava
Как посчитать количество нулей і единиц в строке,

Покажите в вашем коде хоть одну строку

#3 Июнь 6, 2017 14:49:45

Sergava Зарегистрирован: 2017-06-06 Сообщения: 5 Репутация: 0 Профиль Отправить e-mail

Подсчитать количество нулей и единиц

print(r(0,1),end='') 

Например я введу 10 в input, тогда вывод будет например 0101110110.
Как посчитать количество 0 и 1?

#4 Июнь 6, 2017 15:12:51

Rodegast От: Пятигорск Зарегистрирован: 2007-12-28 Сообщения: 2647 Репутация: 179 Профиль Отправить e-mail

Подсчитать количество нулей и единиц

>>> "10101010001".count("1") 5 >>> "10101010001".count("0") 6 

С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

#5 Июнь 6, 2017 15:44:35

Sergava Зарегистрирован: 2017-06-06 Сообщения: 5 Репутация: 0 Профиль Отправить e-mail

Подсчитать количество нулей и единиц

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

#6 Июнь 7, 2017 01:41:00

py.user.next От: Зарегистрирован: 2010-04-29 Сообщения: 9675 Репутация: 841 Профиль Отправить e-mail

Подсчитать количество нулей и единиц

>>> from random import randint as r >>> >>> while 1: . s = input('\nкол-во: ') . if not s: . break . x = int(s) . lst = [r(0, 1) for i in range(x)] . nzeros = lst.count(0) . nones = lst.count(1) . print('Список:', lst) . print('Нулей:', nzeros) . print('Единиц:', nones) . кол-во: 10 Список: [1, 1, 0, 1, 1, 0, 1, 1, 0, 0] Нулей: 4 Единиц: 6 кол-во: >>> 

Отредактировано py.user.next (Июнь 7, 2017 01:41:07)

#7 Июнь 7, 2017 22:24:18

Sergava Зарегистрирован: 2017-06-06 Сообщения: 5 Репутация: 0 Профиль Отправить e-mail

Подсчитать количество нулей и единиц

py.user.next
Таким способом я делал, даже вышло.
Вот только списком выводить мне не вариант.
Я пробовал сделать другим способом, но чёт не выходит.
Если создать переменные zero = 0, one = 0, при каждом выводе рандомного числа,если это 0, то к zero +1, если это 1, то к one +1 добавлять и в конце вывести результат, должно получится.
Помогите исправить мой код:

import random x = random.randint(0, 1) zero = 0 one = 0 while 1: vvod = input('кол-во: ') for i in range(int(vvod)): if x == 0: nul = nul + 1 elif x == 1: one = one + 1 print(x) print('нулей: ', zero) print('единиц: ', one) 

#8 Июнь 7, 2017 23:06:02

Romissevd От: Счастье Зарегистрирован: 2015-03-01 Сообщения: 533 Репутация: 76 Профиль Отправить e-mail

Подсчитать количество нулей и единиц

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

import random nul = 0 one = 0 while 1: vvod = input('кол-во: ') for i in range(int(vvod)): x = random.randint(0, 1) if x == 0: nul = nul + 1 elif x == 1: one = one + 1 print(x) print('нулей: ', nul) print('единиц: ', one) 

#9 Июнь 7, 2017 23:35:56

Sergava Зарегистрирован: 2017-06-06 Сообщения: 5 Репутация: 0 Профиль Отправить e-mail

Подсчитать количество нулей и единиц

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

теперь понял
спасибо большое!

Как посчитать число единиц в строке

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Помог: 3 раз(а)

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

Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо

После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..

Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.

Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.

На последок как оно происходит на форумах

Цитата:

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.

Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *