Jak otrzymać resztę z dzielenia przez 3 bez dzielenia?
Kolega podpowiedział, żeby pomnożyć liczbę przez 4, ale nie wiem, co dalej...
Jak otrzymać resztę z dzielenia przez 3 bez dzielenia?
Kolega podpowiedział, żeby pomnożyć liczbę przez 4, ale nie wiem, co dalej...
jak chcesz dostać wynik bez wykonania operacji? i napisz jaki język
x mod y
Język: asembler
odejmować drugą liczbę od pierwszej tak długo, jak wynik jest większy od drugiej liczby.
pomnozyc przez tyle by starsze slowo iloczynu bylo ilorazem z dzielenia przez trzy, pomnozyc przez trzy, odjac od liczby i masz
#include <cstdio>
int main()
{
int a, b;
printf("Podaj a: ");
scanf("%d", &a);
printf("Podaj b: ");
scanf("%d", &b);
while(a - b >= b)
a = a - b;
printf("Reszta z dzielenia a przez b to %d", a - b);
return 0;
}
Mogę to dać w c++, więc się przyjrzyj i przepisz.
Dodam, że sposób działa dla liczb nieujemnych
Nie mogę korzystać z pętli, skoków, stosu, itp.
#include <iostream>
#include <cstdio>
using namespace std;
struct regs {unsigned long int ax,dx;};
union u {regs r; unsigned long long adx;} res;
main(){
int n;
for(n=1; n<100; n++ ) {
res.r.dx = 0x55555555; // 2^32 / 3
res.r.ax = n + 1;
res.adx = (unsigned long long int)res.r.ax * res.r.dx;
res.r.ax = n - 3 * res.r.dx;
printf("%4d %d %d\n", n, n%3, res.r.ax); }}
Proszę (akurat mi się nudziło):
[BITS 32]
[SECTION .text]
[EXTERN scanf]
[EXTERN printf]
[GLOBAL main]
main:
push x
push fmt
call scanf
add esp, 2*4
mov ecx, DWORD [x]
mov edx, 0xAAAAAAAB
mov eax, ecx
mul edx
shr edx, 1
lea eax, [edx+edx*2]
sub ecx, eax
push ecx
push fmt
call printf
add esp, 2*4
xor eax, eax
ret
[SECTION .data]
fmt: db "%u",0
x: dd 0
PS. Kod używa stosu, ale może ci się przyda.
Jak otrzymać resztę z dzielenia przez 3 bez dzielenia?
static int reszta_z_3(int n)
{
int[] tab = {0,1,2,0,1,2,0,1,2,0};
string s = n.ToString();
while (s.Length > 1)
{
int m = 0;
for (int i=0; i<s.Length; i++)
m += s[i]-48;
s = m.ToString();
}
return tab[s[0]-48];
}
zagadka: jak to działa?
Ze starego toolsa do dzielenia wg. dokumentacji AMD
; signed division by constant (3)
; dividend: memory location or register other than EAX or EDX
mov eax, 055555556h
imul dividend
mov eax, dividend
shr eax, 31
add edx, eax
; quotient now in EDX
; unsigned division by constant (3)
; dividend: register other than EAX or memory location
mov eax, 0AAAAAAABh
mul dividend
shr edx, 1
; quotient now in EDX
Nie mogę też mnożyć :)
W asemblerze ma być tylko wstawka :)