CODY Contest 2020 Basics-Binary Logic 10 questions

Problème 15. Trouvez la plus longue séquence de 1 dans une séquence binaire.

Étant donné une chaîne telle que

s = "011110010000000100010111"

trouver la longueur de la plus longue chaîne de 1 consécutifs. Dans cet exemple, la réponse serait 4.

Exemple:

Entrée x = '110100111'

La sortie y est 3

Trouvez la longueur maximale des occurrences consécutives de «1» dans la chaîne x avec seulement «0» et «1». Comme il n'y a que «1» et «0», vous pouvez utiliser «0» pour diviser x pour obtenir chaque 1 continu La sous-chaîne qui apparaît, et la stocker dans le tuple, puis traverser la sous-chaîne à son tour pour obtenir la longueur (l'index de tuple doit utiliser {})

function y = lengthOnes(x)
    x=strsplit(x,'0');
    y=0;
    for i=1:length(x)
        y=max(y,length(x{i}));
    end
end

 第二 题 Problème 2522. Convertissez un nombre décimal donné en nombre binaire.

Convertit un nombre décimal donné en nombre binaire.

Exemple x = 10, alors la réponse doit être 1010.

Convertissez le nombre décimal entré en nombre binaire.

Si vous ne voulez pas être gênant, vous pouvez directement utiliser dec2bin pour convertir le décimal d'entrée en binaire, mais la sortie est une chaîne, puis utiliser str2num.

function y = dec_bin(x)
  y = str2num(dec2bin(x));
end

Question 3 Problème 2678. Trouver la somme et la retenue de l'additionneur binaire

Trouvez la somme et la retenue d'un additionneur binaire si la retenue précédente est donnée avec deux bits (x et y) pour l'addition.

Exemples

Le report précédent est 1 et x = y = 1. L'addition est de 1 et le report est également de 1.

Le report précédent est 0 et x = y = 1. L'addition est de 0 et le report est également de 1.

Le report précédent est 0 et x = 1, y = 0. L'addition est de 1 et le report est également de 0.

Avant qu'il y ait un pc de report, trouvez le résultat du report après la position actuelle x + y et la position actuelle.

Le bit courant a trois valeurs, xy et pc. Tout d'abord, ajoutez-les, car il s'agit d'une représentation binaire. Si la valeur de x + y + pc est supérieure ou égale à 2, alors le bit suivant sera 1 (report = 1), et le courant La valeur du bit moins 2, sinon carry est égal à 0. Simplified to carry est égal à si pc + x + y est supérieur ou égal à 2; la valeur de la somme est égale au reste de pc + x + y divisé par 2.

function [sum, carry] = bin_sum_carry(pc,x,y)
    sum=mod(x+y+pc,2);
    carry=x+y+pc>=2;  
end

Problème 34. Nombres binaires

Étant donné un entier scalaire n positif, créez une matrice double précision (2 ^ n) -by-n contenant les nombres binaires de 0 à 2 ^ n-1. Chaque ligne de la matrice représente un nombre binaire. Par exemple, si n = 3, votre code pourrait renvoyer

>> numéros_binaires (3)

ans =

1 1 1

0 0 0

0 1 1

0 1 0

0 0 1

1 0 0

1 1 0

1 0 1

L'ordre des lignes n'a pas d'importance.

 

Étant donné n, renvoie une matrice de taille 2 ^ n * n. Chaque ligne représente un nombre binaire de 0 à 2 ^ n-1. Selon l'exemple de n = 3 dans la copie, la position du nombre binaire semble être arbitraire, vous n'avez donc pas besoin de suivre Organisé par taille.

Mais écrire dans l'ordre peut être plus satisfaisant.L'idée de cette question est la suivante: Pour n égal à 3 et 4, l'ordre du plus grand au plus petit est le suivant:

 

On peut voir que la première moitié de la première colonne est toute 1, et les 1-4, 9-12 de la deuxième colonne sont 1 ... On peut en conclure que de la première colonne à la dernière colonne, la longueur de 1 apparaît consécutivement à partir de 2 ^ (n -1) Continuez à réduire à 2 par un multiple de 1/2. Si le 1 ou le 0 continu est considéré comme un bloc, le nombre de blocs de la première colonne à la dernière colonne augmenter de 2 fois de 2 à 2 ^ n. Commencez par créer une matrice avec des zéros. En supposant qu'il s'agit de la i-ème colonne, la longueur de bloc de 1 est 2 ^ (ni) et le nombre de blocs de 1 et 0 est de 2 ^ i. Lorsque j est impair, le j- Le bloc est 1, car les zéros sont utilisés Créé, il n'est donc pas nécessaire de gérer 0. Par conséquent, la position du jème bloc 1 dans la i-ème colonne de la matrice A est A ((j-1) * batch_size + 1: j * batch_size, i), et batch_size représente la longueur du bloc.

function A = binary_numbers(n)
    A=zeros(2^n,n);
    for i=1:n
        batch_size=2^n/2^i;
        batch_num=2^i;
        for j=1:batch_num
            if mod(j,2)==1
                A((j-1)*batch_size+1:j*batch_size,i)=1;
            end
        end
    end
end

Bien sûr, vous pouvez également créer des vecteurs 1 ~ 2 ^ n-1, les convertir en binaire et les enregistrer dans chaque ligne.

第五 题 Problème 108. Étant donné un entier non signé x, trouvez le plus grand y en réorganisant les bits en x

Étant donné un entier x non signé, trouvez le plus grand y en réorganisant les bits de x.

Exemple:

Entrée x = 10

La sortie y est 12

puisque 10 en binaire vaut 1010 et 12 en binaire vaut 1100.

Étant donné un nombre x non signé, recherchez le plus grand nombre décimal après avoir réorganisé la valeur binaire de x. Par exemple, si x vaut 10, alors le chiffre binaire est 1010, le plus grand chiffre après le réarrangement est 1100 et la décimale est 0.

Il peut être converti en binaire, puis trié du plus grand au plus petit (le plus grand réarrangement binaire doit être tous les 1 à l'avant), puis passer en décimal.

function y = maxit(x)
    x=dec2bin(x);
    y=sort(x,'descend');
    y=bin2dec(y);
end

Problème 1295. Inversion de bits

Étant donné un entier x non signé, convertissez-le en binaire avec n bits, inversez l'ordre des bits et reconvertissez-le en entier.

Étant donné un nombre non signé, convertissez-le en un nombre binaire de n bits (avec des zéros à l'avant), puis retournez les bits pour revenir en décimal. Par exemple, x = 11 n = 5, donc le binaire est 01011, la valeur est 11010 et la valeur est 26. (Au début, il est considéré comme inversé, c'est-à-dire que chaque bit de 0 est remplacé par 1, et 1 est remplacé par 0)

Commencez par convertir en binaire, voyez si la longueur de la chaîne est inférieure à n, si elle est inférieure à n, puis remplissez n-length (x) 0: x = [char (zeros (1, n-length (x) ) +48), x]; x représente une chaîne de caractères.

Ensuite, utilisez flipdim pour retourner et reconvertir en décimal.

function y = bit_reverse(x,n)
    x=dec2bin(x);
    if length(x)<n
        x=[char(zeros(1,n-length(x))+48),x];
    end
    y=bin2dec(flipdim(x,2));
end

第七 题 Problème 1547. Rapport relatif de "1" en nombre binaire

L'entrée (n) est un nombre entier positif

La sortie (r) est (nombre de "1" en entrée binaire) / (nombre de bits).

Exemple:

  • n = 0; r = 0
  • n = 1; r = 1
  • n = 2; r = 0,5

Comptez la proportion de «1» dans le système binaire d'un nombre décimal donné.

Après avoir converti n en binaire, comptez le rapport entre le nombre de «1» et la longueur.

function r = ones_ratio(n)
  n=dec2bin(n);
  r=sum(n=='1')/length(n);
end

Question 8 Problème 2891. Code binaire (tableau)

Ecrivez une fonction qui calcule le code binaire d'un nombre 'n' et donne le résultat sous forme de tableau (vecteur).

Exemple:

Entrée n = 123

Sortie y = [1,1,1,1,0,1,1]

Écrivez une fonction pour convertir n en binaire et stockez-la dans un vecteur. La première consiste à convertir des caractères en nombres après avoir utilisé dec2bin, mais il n'est pas bon d'en utiliser trop. Essayez de l'écrire vous-même cette fois.

Récursivité, chaque fois que le reste de x divisé par 2 est placé dans la queue du vecteur, puis x = x / 2 jusqu'à x = 0, puis le vecteur est retourné.

function y = dectobin(x)
  i=1;
    while x>0
       y(i)=mod(x,2);
       i=i+1;
       x=floor(x/2);
    end
    y=flipdim(y,2);
end

Question 9 Problème 43977. Conversion binaire en décimales

Convertissez le binaire en décimales.

Exemple:

010111 = 23.

110000 = 48.

Convertit un nombre binaire en nombre décimal.

Définissez y = 0, prenez le dernier chiffre de x, y = y + le dernier chiffre multiplié par 2 à la puissance de i-1, i représente le jème calcul, puis prenez x divisé par 10 et arrondissez vers le bas. que le x dans le cas de test est une chaîne. Si la chaîne est parcourue directement de l'arrière vers l'avant, il n'est pas nécessaire de prendre le reste et de la diviser par 10. Je suis trop paresseux pour changer la méthode en chaîne et convertir directement la chaîne à un nombre à l'avant.

function y = bin_to_dec(d)
    d=str2num(d);
    y=0;
    i=0;
    while d>0
       y=y+mod(d,10)*2^i;
       i=i+1;
       d=floor(d/10);
    end
end

第十 题 Problème 2869. Il existe 10 types de personnes dans le monde

Ceux qui connaissent le binaire et ceux qui ne le savent pas.

Le nombre 2015 est un palindrome en binaire (11111011111 pour être exact) Étant donné une année (en notation de base 10), calculez combien d'années il faudra encore jusqu'à l'année suivante qui sera un palindrome binaire. Par exemple, si vous avez l'année 1881 (palindrome en base 10! :-), la fonction doit afficher 30, car l'année suivante qui est un palindrome binaire est 1911. Vous pouvez supposer que toutes les années sont des entiers positifs.

Bonne chance !! kcul dooG

Il y a 10 types de personnes dans le monde, l'un est des gens qui comprennent le binaire, et l'autre est des gens qui ne comprennent pas le binaire.

Le binaire de 2015 (11111011111) est un palindrome. À partir d'une année décimale, déterminez l'année suivante comme un palindrome. Par exemple, l'année palindrome suivante en 1881 est 1911, donc la différence entre leurs années est de 30. Cela ressemble à une combinaison de binaire et de palindrome. Il semble que je n'ai pas trouvé de moyen rapide, mais je ne peux que juger s'il s'agit d'un palindrome d'année en année. Commencez par convertir x en binaire, jugez s'il s'agit d'un palindrome, si c'est le cas, puis terminez, sinon y + 1, et ajoutez +1 à la fin de la chaîne binaire x, puis effectuez l'ajout de 1 pour obtenir le binaire de l'année suivante, il n'est pas nécessaire de calculer à plusieurs reprises le binaire pour chaque année.

function y = yearraey(x)
    x=dec2bin(x);
    y=0;
    while 1
        ret = 1;%判断是否为回文
        for i=1:length(x)/2
            if (x(i)~=x(end-i+1))
                ret=0;
                break;
            end
        end
        if ret%是回文 结束
            return;
        end
        y=y+1;%否则 +1
        x(end)=x(end)+1;
        for i=length(x):-1:1%对x进行进位
            if x(i)=='2' %需要进位
                x(i)='0';
                if i>1
                  x(i-1)=x(i-1)+1;
                else
                  x=['1',x];
                  break;
                end
            else %直到不需要进位
                break;
            end
        end            
    end
end

 

Je suppose que tu aimes

Origine blog.csdn.net/qq_36614557/article/details/110679111
conseillé
Classement