Помош за Бутов алгоритам

DonJas

Married and Happy
Член од
22 јуни 2008
Мислења
2.651
Поени од реакции
586
У принцип хејтам да замарам али овој пут морам. Иам мука, неам време. До вечер у 9 ми треба готов програм за множење со бутов алгоритам, арно ама треба да биде сместен во еден темплејт даден од професорите. Си најдов ја на нет програм у C за множење со бутов алгоритам, и дадениот темплејт е во C, али Не сум доволно способен да ги сместам двете у едно. Ако се најде некој шо има троа вишак време и feels like it, би било фино да ми ги склопи некој овие 2 у едно. Частам пиво :)

Темплејт
Код:
#include<stdio.h>
 
// funkcija za mnozenje na dva 8-bitni broja (vo RC format) so Butov algoritam
// vlez:    a[] - mnozenik, b[] - mnozitel
// izlez:    proizvod[] - proizvodot (mnozenik * mnozitel)
void mnozenjeButov(char a[], char b[], char proizvod[]) {
    // izbrisete go dolniot red i vnesete go vasiot kod ovde
    strcpy(proizvod, "00000000");
}
 
int main() {
    int success = 1;
 
    char a[100];
    char b[100];
    char proizvod[100];
    char w_proizvod[100];
 
    // TEST 1
    strcpy(a, "00010011");
    strcpy(b, "00000101");
    strcpy(w_proizvod, "01011111");
    mnozenjeButov(a, b, proizvod);
    printf("TEST 1: %s, %s\n", a, b);
    printf("  Tocen odgovor:    %s\n", w_proizvod);
    printf("  Vas odgovor:      %s\n", proizvod);
 
    if (strcmp(proizvod, w_proizvod) == 0) {
        printf("Vasata programa dava tocen rezultat :-)\n\n");
    } else {
        printf("Vasata programa dava netocen rezultat!\n\n");
        success = 0;
    }
 
    // TEST 2
    strcpy(a, "00010000");
    strcpy(b, "11111001");
    strcpy(w_proizvod, "10010000");
    mnozenjeButov(a, b, proizvod);
    printf("TEST 2: %s, %s\n", a, b);
    printf("  Tocen odgovor:    %s\n", w_proizvod);
    printf("  Vas odgovor:      %s\n", proizvod);
 
    if (strcmp(proizvod, w_proizvod) == 0) {
        printf("Vasata programa dava tocen rezultat :-)\n\n");
    } else {
        printf("Vasata programa dava netocen rezultat!\n\n");
        success = 0;
    }
 
    // TEST 3
    strcpy(a, "11110000");
    strcpy(b, "11111001");
    strcpy(w_proizvod, "01110000");
    mnozenjeButov(a, b, proizvod);
    printf("TEST 3: %s, %s\n", a, b);
    printf("  Tocen odgovor:    %s\n", w_proizvod);
    printf("  Vas odgovor:      %s\n", proizvod);
 
    if (strcmp(proizvod, w_proizvod) == 0) {
        printf("Vasata programa dava tocen rezultat :-)\n\n");
    } else {
        printf("Vasata programa dava netocen rezultat!\n\n");
        success = 0;
    }
 
    // TEST 4
    strcpy(a, "00000100");
    strcpy(b, "00001000");
    strcpy(w_proizvod, "00100000");
    mnozenjeButov(a, b, proizvod);
    printf("TEST 4: %s, %s\n", a, b);
    printf("  Tocen odgovor:    %s\n", w_proizvod);
    printf("  Vas odgovor:      %s\n", proizvod);
 
    if (strcmp(proizvod, w_proizvod) == 0) {
        printf("Vasata programa dava tocen rezultat :-)\n\n");
    } else {
        printf("Vasata programa dava netocen rezultat!\n\n");
        success = 0;
    }
 
    if (success == 1) {
        printf("Vasata programa gi pomina testovite uspesno!\n");
    } else {
        printf("Nekoi od testovite bea neuspesni.\n");
    }
 
    return 0;
}

множење со бутов алгоритам

Код:
/* C Program For Implementation Of Signed Multiplication
OR
C Program for the Implementation Of Booths Algorithm */
 
#include< stdio.h>
#include< conio.h>
#include< process.h>
#include< math.h>
 
int get(int a)
{
char ch='B';
int flag=0;
if(a==1)
ch='A';
do
{
printf("│ ENTER VALUE OF %c: ",ch);
scanf("%d",&a);
if(a< 0)
{
a = a * -1;
flag = 1;
}
if(9< =a)
printf("│\n\t!INVALID NUMBER.ENTER VALUE (-9 < A < 9)!");
}while(9< =a);
if(flag)
a = a *-1;
return(a);
}
 
void add(int *a,int *b)
{
int x,i,c=0;
for(i=3;i>=0;i--)
{
x=a[i];
a[i]=c^x^b[i];
if(((c==1)&&(x==1))||((x==1)&&(b[i]==1))||((b[i]==1)&&(c==1)))
c = 1;
else
c = 0;
}
}
 
void binary(int x,int*arr)
{
int i,p=x,c[4]={0,0,0,1};
for(i=0;i< 4;i++)
arr[i] = 0;
if(x < 0)
x = x *-1;
i = 3;
do
{
arr[i]=x%2;
x = x/2;
i--;
}while(x!=0);
if(p< 0)
{
for(i=0;i< 4;i++)
arr[i]=1-arr[i];
add(arr,c);
}
printf("\n\nTHE BINARY EQUIVALENT OF %d IS : ",p);
for(i=0;i< 4;i++)
printf("%d",arr[i]);
}
 
void rshift(int x,int *y)
{
int i;
for(i=3;i>0;i--)
y[i] = y[i-1];
y[0] = x;
}
 
void main()
{
int q=0,i,j,a,b,A[4]={0,0,0,0},C[4]={0,0,0,1},C1[8]={0,0,0,0,0,0,0,1};
int s=0,z=0,Q[4],M[4],temp,temp1[4],ans[8],y,x=0,c=0;
clrscr();
printf("\n│----------------------------------------------------\n");
a = get(1);
b=get(0);
printf("\n│---------------------------------------------------\n");
binary(a,M);
binary(b,Q);
printf("\n\n---------------------------------------------------\n");
printf(" OPERATION\t\t A\t Q\tQ'\t M");
printf("\n\n INITIAL\t\t");
for(i=0;i< 4;i++)
printf("%d",A[i]);
printf("\t");
for(i=0;i< 4;i++)
printf("%d",Q[i]);
printf("\t");
printf("%d\t",q);
for(i=0;i< 4;i++)
printf("%d",M[i]);
for(j=0;j< 4;j++)
{
if((Q[3]==0)&&(q==1))
{
printf("\n A:=A+M \t\t");
add(A,M);
for(i=0;i< 4;i++)
printf("%d",A[i]);
printf("\t");
for(i=0;i< 4;i++)
printf("%d",Q[i]);
printf("\t%d\t",q);
for(i=0;i< 4;i++)
printf("%d",M[i]);
}
if((Q[3]==1)&&(q==0))
{
printf("\n A:=A-M \t\t");
for(i=0;i< 4;i++)
temp1[i] = 1-M[i];
add(temp1,C);
add(A,temp1);
for(i=0;i< 4;i++)
printf("%d",A[i]);
printf("\t");
for(i=0;i< 4;i++)
printf("%d",Q[i]);
printf("\t%d\t",q);
for(i=0;i< 4;i++)
printf("%d",M[i]);
}
printf("\n Shift \t\t\t");
y = A[3];
q = Q[3];
rshift(A[0],A);
rshift(y,Q);
for(i=0;i< 4;i++)
printf("%d",A[i]);
printf("\t");
for(i=0;i< 4;i++)
printf("%d",Q[i]);
printf("\t");
printf("%d\t",q);
for(i=0;i< 4;i++)
printf("%d",M[i]);
}
printf("\n\n---------------------------------------------------\n");
printf("\nTHE ANSWER IN BINARY IS : ");
for(i=0;i< 4;i++)
ans[i]=A[i];
for(i=0;i< 4;i++)
ans[i+4]=Q[i];
if(((a< 0)&&(b>0))||((a>0)&&(b< 0)))
{
for(i=0;i< 8;i++)
ans[i]=1-ans[i];
for(i=7;i>=0;i--)
{
x = ans[i];
ans[i]=c^x^C1[i];
if(((c==1)&&(x==1))||((x==1)&&(C1[i]==1))||((C1[i]==1)&&(c==1)))
c=1;
else
c=0;
}
}
for(i=0;i< 8;i++)
printf("%d",ans[i]);
for(i=7;i>=0;i--)
{
s = s + (pow(2,z) * ans[i]);
z = z+1;
}
if(((a< 0)&&(b>0))||((a>0)&&(b< 0)))
printf("\nTHE ANSWER IN DECIMAL IS : -%d\n",s);
else
printf("\nTHE ANSWER IN DECIMAL IS : %d\n",s);
getch();
}
По можност да нема библиотеки што ги прават стварите место нас (конверзија во бинарно енд шит)

Фала :)
 

GoD.HateUSaLL

Фар акрос д диштанс
Член од
30 март 2008
Мислења
8.339
Поени од реакции
8.238
Pussy is good my friend..
 

shadow_rr

Resistance is Futile
Член од
8 јули 2006
Мислења
1.807
Поени од реакции
323
У принцип хејтам да замарам али овој пут морам. Иам мука, неам време. До вечер у 9 ми треба готов програм за множење со бутов алгоритам, арно ама треба да биде сместен во еден темплејт даден од професорите. Си најдов ја на нет програм у C за множење со бутов алгоритам, и дадениот темплејт е во C, али Не сум доволно способен да ги сместам двете у едно. Ако се најде некој шо има троа вишак време и feels like it, би било фино да ми ги склопи некој овие 2 у едно. Частам пиво :)

По можност да нема библиотеки што ги прават стварите место нас (конверзија во бинарно енд шит)

Фала :)

Имаш среќа, му ја решавав на цимерот пред неколку месеци и уште ми стои во компјутеров... :)

PHP:
#include<stdio.h>
#include<string.h>
 
void pomestiDesno(char a[], char bit) {
    int i, dolzhina = strlen(a);
    for (i = dolzhina - 1; i > 0; i--) {
        a[i] = a[i-1];
    }
    a[0] = bit;
}
 
void sobiranje(char a[], char b[]) {
    int i, dolzhina = strlen(a) - 1;
    int flag = 0;
    for (i = dolzhina; i >= 0; i--) {
        if (flag) {
            if (b[i] == '1') {
                if (a[i] == '1') {
                    b[i] = '1';
                } else {
                    b[i] = '0';
                }
            } else {
                if (a[i] == '1') {
                    b[i] = '0';
                } else {
                    b[i] = '1';
                    flag = 0;
                }
            }
        } else {
            if (b[i] == '0') {
                b[i] = a[i];
            } else {
                if (a[i] == '0') {
                    b[i] = '1';
                } else {
                    b[i] = '0';
                    flag = 1;
                }
            }
        }
    }
    b[strlen(b)] = '\0';
}
 
void komplement(char a[]) {
    int i;
    for(i = 0; i < strlen(a); i++) {
        if(a[i] == '1') a[i] = '0';
        else a[i] = '1';
    }
}
 
void RcNegativen(char a[]) {
    komplement(a);
    sobiranje("00000001", a);
}
 
void odzemanje(char a[], char b[]) {
    char res[10];
    strcpy(res, a);
    RcNegativen(res);
    sobiranje(res, b);
}
 
void inicijaliziraj(char a[], char p[]) {
    char r[20] = "00000000";
    int i;
    for (i = 8; i < 17; i++) {
        r[i] = a[i - 8];
    }
    r[16] = '0';
    r[17] = '\0';
    strcpy(p, r);
}
 
void skratiNepotrebni(char a[], char rez[]) {
    int i;
    for (i = 8; i < 16; i++) {
        rez[i - 8] = a[i];
    }
    rez[8] = '\0';
}
 
void mnozenjeButov(char a[], char b[], char proizvod[]) {
    int i; char temp[10];
    inicijaliziraj(b, proizvod);
    for (i = 0; i < 8; i++) {
        if (proizvod[strlen(proizvod) - 1] != proizvod[strlen(proizvod) - 2]) {
            if (proizvod[strlen(proizvod) - 2] == '1') {
                odzemanje(a, proizvod);
            } else {
                sobiranje(a, proizvod);
            }
        }
        pomestiDesno(proizvod, proizvod[0]);
    }
    skratiNepotrebni(proizvod, temp);
    strcpy(proizvod, temp);
}
 
int main() {
    int success = 1;
 
    char a[100];
    char b[100];
    char proizvod[100];
    char w_proizvod[100];
 
    // TEST 1
    strcpy(a, "00010011");
    strcpy(b, "00000101");
    strcpy(w_proizvod, "01011111");
    mnozenjeButov(a, b, proizvod);
    printf("TEST 1: %s, %s\n", a, b);
    printf("  Tocen odgovor:    %s\n", w_proizvod);
    printf("  Vas odgovor:      %s\n", proizvod);
 
    if (strcmp(proizvod, w_proizvod) == 0) {
        printf("Vasata programa dava tocen rezultat :-)\n\n");
    } else {
        printf("Vasata programa dava netocen rezultat!\n\n");
        success = 0;
    }
 
    // TEST 2
    strcpy(a, "00010000");
    strcpy(b, "11111001");
    strcpy(w_proizvod, "10010000");
    mnozenjeButov(a, b, proizvod);
    printf("TEST 2: %s, %s\n", a, b);
    printf("  Tocen odgovor:    %s\n", w_proizvod);
    printf("  Vas odgovor:      %s\n", proizvod);
 
    if (strcmp(proizvod, w_proizvod) == 0) {
        printf("Vasata programa dava tocen rezultat :-)\n\n");
    } else {
        printf("Vasata programa dava netocen rezultat!\n\n");
        success = 0;
    }
 
    // TEST 3
    strcpy(a, "11110000");
    strcpy(b, "11111001");
    strcpy(w_proizvod, "01110000");
    mnozenjeButov(a, b, proizvod);
    printf("TEST 3: %s, %s\n", a, b);
    printf("  Tocen odgovor:    %s\n", w_proizvod);
    printf("  Vas odgovor:      %s\n", proizvod);
 
    if (strcmp(proizvod, w_proizvod) == 0) {
        printf("Vasata programa dava tocen rezultat :-)\n\n");
    } else {
        printf("Vasata programa dava netocen rezultat!\n\n");
        success = 0;
    }
 
    // TEST 4
    strcpy(a, "00000100");
    strcpy(b, "00001000");
    strcpy(w_proizvod, "00100000");
    mnozenjeButov(a, b, proizvod);
    printf("TEST 4: %s, %s\n", a, b);
    printf("  Tocen odgovor:    %s\n", w_proizvod);
    printf("  Vas odgovor:      %s\n", proizvod);
 
    if (strcmp(proizvod, w_proizvod) == 0) {
        printf("Vasata programa dava tocen rezultat :-)\n\n");
    } else {
        printf("Vasata programa dava netocen rezultat!\n\n");
        success = 0;
    }
 
    if (success == 1) {
        printf("Vasata programa gi pomina testovite uspesno!\n");
    } else {
        printf("Nekoi od testovite bea neuspesni.\n");
    }
 
    return 0;
}
 

Kajgana Shop

На врв Bottom