Практика программирования (Бейсик, Си, Паскаль)


Задачи,советы и ответы - часть 21


dig10:=m div 10;

{ Выделение десятков, если diqlO >=20 }

Result:=Result+num2[dig10] ;

digl:=m mod 10; { Если в числе присутствуют ненулевые разряды единиц }

if dig100 then Result:=Result + numl[digl];

ret:

num_to_str:=Result;

end;

begin

clrscr;

write{'Введите целое число : ');

readln (n) ;

writeln(n, ' = ' ,num_to__str (n) ) ;

readln; end.

Задание 2.12. Суммирование двоичных цифр

Составить функцию sum_bits(n), аргументом которой является длинное целое число. Возвращаемое значение должно быть равно количеству единиц в двоичном представлении числа п.

Совет 1 (общий)

Обратите внимание на тот факт, что отрицательные числа представлены в памяти компьютера в дополнительном коде. Поэтому число -1 содержит 32 единицы в своем двоичном разложении.

Совет 2 (QBasic)

Так как входной язык QBasic не содержит операции сдвига, схитрим — разделим на 2 битовую шкалу J&, заставив сдвинуться влево ее единственную единицу. Начать с J&=&H80000000 нельзя, т. к. это очень странное "число". Поэтому приходится знак N проверять отдельно, а в цикле анализ производить, начиная с 30-го разряда.

Программа 2_12.bas

RЕМ Суммирование двоичных цифр введенного числа

INPUT "Вводи N"/ N&

Js=&H40000000

RESULT=0

IF N&<0 THEN RESULT=1 : ' Учет 1 в знаке отрицательного числа

FOR K=31 TO I STEP -1

IF N& AND J& THEN RESULT=RESULT+1 : ' Учет k-того разряда

J&=J&/2 : ' Сдвиг шкалы на разряд вправо NEXT К PRINT RESULT END

Программа 2_12.с

/* Суммирование двоичных цифр введенного числа */

#include <stdlib.h>

int sum_bits(long N) ;

main () {

long M;

printf("ХпВведите целое число: ");

scanf("%ld",&M);

printf("\n Сумма его цифр = %d",sum_bits(M));

getch(); }

int sum_bits(long N)

/* Подсчет единиц в двоичном представлении N */

{

int Result=0,k;

unsigned long j=0x80000000;

for(k=31; k >= 0; k--) {

if(j & N) Result++;

/* Учет k-того разряда */




- Начало -  - Назад -  - Вперед -