Reszta z dzielenia przez 3 bez dzielenia

0

Jak otrzymać resztę z dzielenia przez 3 bez dzielenia?

Kolega podpowiedział, żeby pomnożyć liczbę przez 4, ale nie wiem, co dalej...

0

jak chcesz dostać wynik bez wykonania operacji? i napisz jaki język

0

x mod y

0

Język: asembler

4

odejmować drugą liczbę od pierwszej tak długo, jak wynik jest większy od drugiej liczby.

0

pomnozyc przez tyle by starsze slowo iloczynu bylo ilorazem z dzielenia przez trzy, pomnozyc przez trzy, odjac od liczby i masz

0
#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

0

Nie mogę korzystać z pętli, skoków, stosu, itp.

0
#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); }} 
0

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.

0

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?

0

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
0

Nie mogę też mnożyć :)

W asemblerze ma być tylko wstawka :)

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