Program liczacy roznice w bitach

0

Hej mam za zadanie napisac program ktory policzy roznice w bitach napisu1 i napisu2 cos juz napisalam ale wynik nie jest taki jaki powinien byc jakas porada? Powinno wyjsc ze 56 roznych jest 52

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
    char napis1[100] = "e83e129a4bf98394ebb230e8c0ca3c190473df45550c0d1c10eed8ea";
    char napis2[100] = "d3ee2ff3860810093c016266108760f29bcd7ebb2ad4436e94ee8343";
    printf(" napis1 : %d\n ", (int)strlen(napis1));
    int roznica = 0;
    for (int i = 0; i < 100; i++) {
        if (napis1[i] == napis2[i]) {
            ++roznica;
        }
    }
    if (napis1 == napis2)
        printf("Oba ciagi sa takie same");
    else
        printf("Liczba rozniacych się bitow z %ld to %d\n", strlen(napis1), roznica);
    return 0;
}
0

Przyjrzyj się swojemu warunkowi.

5

Tak an szybko, powinno być ok

 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
    char napis1[100] = "e83e129a4bf98394ebb230e8c0ca3c190473df45550c0d1c10eed8ea";
    char napis2[100] = "d3ee2ff3860810093c016266108760f29bcd7ebb2ad4436e94ee8343";
    int length =  strlen(napis1);
    printf(" napis1 : %d\n ", length);
    if (napis1 == napis2)
        printf("Oba ciagi sa takie same");
    else {
        int roznica = 0;
        for (int i = 0; i < length; i++) {
            if (napis1[i] != napis2[i]) {
                ++roznica;
            }
        }
        printf("Liczba rozniacych się bitow z %ld to %d\n",length, roznica);
        float result = roznica * 100 / length;
        printf("%0.2f %%", result);
    }

    return 0;
}
3

jak powinno być ok? Jest zupełnie źle.
Takie coś if (napis1 == napis2) to może napisać tylko newbie z programowania.
Na dodatek kod nie robi tego co powinien robić.

myszkapyszka napisał(a):

policzy różnice w bitach napisu1 i napisu2

a nie różnice w znakach!

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

int NumberOfSetBits(int i)
{
    i = i - ((i >> 1) & 0x55555555);
    i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
    return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}


int CountDifferentBitsInBytes(const char *a, const char *b, int count)
{
    int result = 0;
    
    while (count--)
    {
        result += NumberOfSetBits(*a ^ *b);
        a++;
        b++;
    }
    return result;
}

int CountDifferentBitsInStrings(const char *a, const char *b)
{
    int lenA = strlen(a);
    int lenB = strlen(b);
    int minLen = lenA<lenB ? lenA : lenB;
    int maxLen = lenA<lenB ? lenB : lenA;
    
    return (maxLen - minLen) * 8 + CountDifferentBitsInBytes(a, b, minLen);
}

int main(void)
{
    char s1[0x100];
    char s2[0x100];
    
    while (gets(s1) && gets(s2)) {
        printf("%s - %s\n\tbits difrent: %d\n ", s1, s2, CountDifferentBitsInStrings(s1, s2));
    }
    return 0;
}

Wynik wychodzi 156 a nie 56, są dwa wyjaśnienia: autor źle coś przepisał z treści zadania i ma być 156, albo mają być liczone bity nie dla napisu, ale dla zapisu szesnastkowego ciągu danych (nie chce mi się tego sprawdzać, poprawka do kodu jest bardzo prosta).
No chyba, że gdzieś walnąłem się w kodzie.
http://melpon.org/wandbox/permlink/w4LxqMYlfDskhhhB
ale testy pokazują raczej, że jest ok.

0 użytkowników online, w tym zalogowanych: 0, gości: 0