kzen.dev
  • Întrebări
  • Tag-uri
  • Utilizatori
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
Utilizator anonim
Question

Mod de număr negativ se topește creierul meu

Am'm încercând să-mod un număr întreg pentru a obține o serie de poziție, astfel încât acesta va buclă rotundă. Face i % arrayLength funcționează bine pentru numere pozitive, dar pentru numere negative totul merge bine.

 4 % 3 == 1
 3 % 3 == 0
 2 % 3 == 2
 1 % 3 == 1
 0 % 3 == 0
-1 % 3 == -1
-2 % 3 == -2
-3 % 3 == 0
-4 % 3 == -1

deci am nevoie de o punere în aplicare a

int GetArrayIndex(int i, int arrayLength)

astfel că

GetArrayIndex( 4, 3) == 1
GetArrayIndex( 3, 3) == 0
GetArrayIndex( 2, 3) == 2
GetArrayIndex( 1, 3) == 1
GetArrayIndex( 0, 3) == 0
GetArrayIndex(-1, 3) == 2
GetArrayIndex(-2, 3) == 1
GetArrayIndex(-3, 3) == 0
GetArrayIndex(-4, 3) == 2

Am'am făcut acest lucru înainte, dar pentru unii motiv,'s topire creierul meu de azi :(

174 2009-07-04T20:22:43+00:00 11
Colonel Panic
Colonel Panic
Întrebarea editată 7 mai 2015 в 2:52
Programare
c#
math
modulo
Popular videos
Negativ ton de fata cu glasul meu strig numele tau. Fernando din Barbulesti (Abonați-va)
Negativ ton de fata cu glasul meu strig numele tau. Fernando din Barbulesti (Abonați-va)
2 ani în urmă
Striga către domnul NEGATIV
Striga către domnul NEGATIV
6 ani în urmă
NEGATIV - Numai Dumnezeu mi-a schimbat viața (NOU 2022)
NEGATIV - Numai Dumnezeu mi-a schimbat viața (NOU 2022)
1 an în urmă
✔️Negativ ✔️Marius din Barbulesti - Atunci cand esti zdrobit! (Instrumental)
✔️Negativ ✔️Marius din Barbulesti - Atunci cand esti zdrobit! (Instrumental)
1 an în urmă
E lupta tot mai grea pe cale (Negativ cu versuri )
E lupta tot mai grea pe cale (Negativ cu versuri )
2 ani în urmă
Tu nu disprețuiești o inimă zdrobită negativ cu versuri
Tu nu disprețuiești o inimă zdrobită negativ cu versuri
1 an în urmă
Negativ Original ❌ Nimeni să nu se fălească | Marian din Murgeni
Negativ Original ❌ Nimeni să nu se fălească | Marian din Murgeni
1 an în urmă
Cuvantul Intrupat - NEGATIV 2021
Cuvantul Intrupat - NEGATIV 2021
1 an în urmă
Negativ set Colaj/ Cum Doreste cerbul apa vie/ cânt din toata inima/ e putere in numele lui Isus
Negativ set Colaj/ Cum Doreste cerbul apa vie/ cânt din toata inima/ e putere in numele lui Isus
2 ani în urmă
CORINA MOLDOVAN  NEGATIV ÎNTR-UN SAT DIN GALILEEA
CORINA MOLDOVAN NEGATIV ÎNTR-UN SAT DIN GALILEEA
1 an în urmă
Nume frumos E Numele lui Isus - (Negativ) | Shepherd of Love
Nume frumos E Numele lui Isus - (Negativ) | Shepherd of Love
3 ani în urmă
Negativ - Cine e ca Domnul slavei? - Mariana Someșan [NOU 2022]
Negativ - Cine e ca Domnul slavei? - Mariana Someșan [NOU 2022]
1 an în urmă
Marian din Barbulesti - Negativ - Tu nu disprețuiești
Marian din Barbulesti - Negativ - Tu nu disprețuiești
1 an în urmă
« Anterior
Următor »
 ShreevatsaR
ShreevatsaR
4 iulie 2009 в 8:35
2009-07-04T20:35:50+00:00
Mai mult
Sursă
Editează
#9228797

Eu folosesc întotdeauna propriul meu " mod " funcția, definită ca

int mod(int x, int m) {
    return (x%m + m)%m;
}

Desigur, daca're deranjat despre două apeluri la modul de funcționare, ai putea scrie ca

int mod(int x, int m) {
    int r = x%m;
    return r<0 ? r+m : r;
}

sau variante ale acestora.

Motivul pentru care funcționează este că "x%m" este întotdeauna în intervalul [-m+1, m-1]. Deci, dacă acesta este negativ, adăugând m pentru a va pune in intervalul pozitiv, fără a schimba valoarea sa modulo m.

 ShreevatsaR
ShreevatsaR
Răspuns editat 9 ianuarie 2013 в 4:22
263
0
Петър Петров
Петър Петров
19 iunie 2011 в 4:07
2011-06-19T04:07:56+00:00
Mai mult
Sursă
Editează
#9228798

Vă rugăm să rețineți că C# și C++'s % operator este de fapt o modulo, l's rest. Formula pentru modulo pe care doriți, în cazul tău, este:

float nfmod(float a,float b)
{
    return a - b * floor(a / b);
}

Trebuie să recode acest lucru în C# (sau C++), dar acest lucru este modul în care obține modulo și nu un rest.

Петър Петров
Петър Петров
Răspuns editat 14 februarie 2013 в 6:44
74
0
Evgeni Sergeev
Evgeni Sergeev
22 aprilie 2014 в 8:27
2014-04-22T08:27:50+00:00
Mai mult
Sursă
Editează
#9228802

Single-line punerea în aplicare folosind % doar o singură dată:

int mod(int k, int n) {  return ((k %= n) < 0) ? k+n : k;  }
13
0
Abin Mathew
Abin Mathew
29 octombrie 2013 в 10:32
2013-10-29T10:32:24+00:00
Mai mult
Sursă
Editează
#9228800

Adăugarea de puțină înțelegere.

De Euclidiene definiție mod rezultatul trebuie să fie întotdeauna pozitiv.

Ex:

 int n = 5;
 int x = -3;

 int mod(int n, int x)
 {
     return ((n%x)+x)%x;
 }

Ieșire:

 -1
Jeff B
Jeff B
Răspuns editat 2 octombrie 2015 в 9:39
6
0
 dcastro
dcastro
4 ianuarie 2014 в 6:08
2014-01-04T18:08:44+00:00
Mai mult
Sursă
Editează
#9228801

ShreevatsaR's a răspunde câștigat't de lucru pentru toate cazurile, chiar dacă adăugați "dacă(m<0) m=-m;", daca tii cont de negative dividende/divizori.

De exemplu, -12 mod -10 va fi de 8, și ar trebui să fie -2.

Următoarele implementare va lucra pentru atât pozitive, cât și negative dividende / divizori și în conformitate cu alte implementări (și anume, Java, Python, Ruby, Scala, Schema, Javascript și Google's Calculator):

internal static class IntExtensions
{
    internal static int Mod(this int a, int n)
    {
        if (n == 0)
            throw new ArgumentOutOfRangeException("n", "(a mod 0) is undefined.");

        //puts a in the [-n+1, n-1] range using the remainder operator
        int remainder = a%n;

        //if the remainder is less than zero, add n to put it in the [0, n-1] range if n is positive
        //if the remainder is greater than zero, add n to put it in the [n-1, 0] range if n is negative
        if ((n > 0 && remainder < 0) ||
            (n < 0 && remainder > 0))
            return remainder + n;
        return remainder;
    }
}

Test suite folosind xUnit:

    [Theory]
    [PropertyData("GetTestData")]
    public void Mod_ReturnsCorrectModulo(int dividend, int divisor, int expectedMod)
    {
        Assert.Equal(expectedMod, dividend.Mod(divisor));
    }

    [Fact]
    public void Mod_ThrowsException_IfDivisorIsZero()
    {
        Assert.Throws<ArgumentOutOfRangeException>(() => 1.Mod(0));
    }

    public static IEnumerable<object[]> GetTestData
    {
        get
        {
            yield return new object[] {1, 1, 0};
            yield return new object[] {0, 1, 0};
            yield return new object[] {2, 10, 2};
            yield return new object[] {12, 10, 2};
            yield return new object[] {22, 10, 2};
            yield return new object[] {-2, 10, 8};
            yield return new object[] {-12, 10, 8};
            yield return new object[] {-22, 10, 8};
            yield return new object[] { 2, -10, -8 };
            yield return new object[] { 12, -10, -8 };
            yield return new object[] { 22, -10, -8 };
            yield return new object[] { -2, -10, -2 };
            yield return new object[] { -12, -10, -2 };
            yield return new object[] { -22, -10, -2 };
        }
    }
 dcastro
dcastro
Răspuns editat 7 ianuarie 2014 в 1:38
5
0
 starblue
starblue
4 iulie 2009 в 8:31
2009-07-04T20:31:52+00:00
Mai mult
Sursă
Editează
#9228796

Trebuie doar să adăugați modulul (arrayLength) pentru rezultatul negativ al % și'll fi bine.

4
0
Markus Cozowicz
Markus Cozowicz
31 iulie 2015 в 12:29
2015-07-31T00:29:20+00:00
Mai mult
Sursă
Editează
#9228803

Pentru mai performanta conștienți devs

uint wrap(int k, int n) ((uint)k)%n

O mică comparație a performanței

Modulo: 00:00:07.2661827 ((n%x)+x)%x)
Cast:   00:00:03.2202334 ((uint)k)%n
If:     00:00:13.5378989 ((k %= n) < 0) ? k+n : k

Ca pentru performanță costul de distributie a uint avea o privire de aici

4
0
 lilo0
lilo0
25 iunie 2018 в 7:49
2018-06-25T07:49:53+00:00
Mai mult
Sursă
Editează
#9228804

Compararea a două predominant răspunsuri

(x%m + m)%m;

și

int r = x%m;
return r<0 ? r+m : r;

De fapt, nimeni nu a menționat faptul că primul poate arunca un OverflowException în timp ce, în cel de-al doilea a câștigat&#39;t. Chiar mai rău, cu default necontrolat context, primul răspuns ar putea reveni răspunsul greșit (a se vedeamod(int.MaxValue - 1, int.MaxValue)` de exemplu). Deci, al doilea răspuns nu numai că pare să fie mai rapid, dar, de asemenea, mai corect.

 Jesse
Jesse
Răspuns editat 25 iunie 2018 в 8:30
4
0
 RenniePet
RenniePet
15 aprilie 2013 в 7:12
2013-04-15T19:12:25+00:00
Mai mult
Sursă
Editează
#9228799

Îmi place trucul prezentat de Peter N Lewis pe acest thread: "Dacă n-are o gamă limitată, atunci puteți obține rezultatul dorit, pur și simplu prin adăugarea unui cunoscut constanta multiple de [divizor] care este mai mare ca valoarea absolută minimă."

Deci, dacă am avea o valoare d, care este în grade și vreau să-l iau

d % 180f

și vreau să evit problemele, dacă d este negativ, atunci în loc să fac asta:

(d + 720f) % 180f

Aceasta presupune că, deși d poate fi negativ, este cunoscut faptul că niciodată nu va fi mai mult negative decât -720.

 Community
Community
Răspuns editat 23 mai 2017 в 11:54
2
0
 fahd
fahd
21 septembrie 2019 в 11:23
2019-09-21T11:23:08+00:00
Mai mult
Sursă
Editează
#9228806

Am observat Un lucru. Este oferindu-doar numere pozitive în python imprimare 4%3 print 3%3 print 3%3 imprimare 2%3 imprimare 1%3 print 0%3 imprimare -1%3 imprimare -2%3 imprimare -3%3 imprimare -4%3 - asta mi-a dat 1 Zero Zero Două Unul Zero Două Unul Zero Două Dar În C, este de a da răspunsurile date de @gormenghastly

#include<stdio.h>

int main()
{
printf("\n %d",3 % 3);
printf("\n %d",4 % 3);
printf("\n %d",3 % 3);
printf("\n %d",2 % 3);
printf("\n %d",1 % 3); 
printf("\n %d", 0 % 3);
printf("\n %d",-1 % 3);
printf("\n %d",-2 % 3);
printf("\n %d",-3 % 3);
printf("\n %d",-4 % 3);

return 0;
}

Am fost a face definiția % din ceea ce am putut vedea din python ieșire, Dar acum eu sunt, de asemenea, confuz

0
0
Aaron Franke
Aaron Franke
24 ianuarie 2019 в 3:05
2019-01-24T03:05:09+00:00
Mai mult
Sursă
Editează
#9228805

Toate răspunsurile aici mare lucru dacă este divizor pozitiv, dar's nu destul de complet. Aici este punerea în aplicare a mea care se întoarce mereu pe o serie de `[0, b), astfel încât semnul de ieșire este aceeași ca semn al divizor, pentru a permite negative divizori ca endpoint pentru gama de ieșire.

PosMod(5, 3) a se întoarce 2 PosMod(-5, 3) a se întoarce 1 PosMod(5, -3) a se întoarce -1 PosMod(-5, -3) a se întoarce -2

    /// <summary>
    /// Performs a canonical Modulus operation, where the output is on the range [0, b).
    /// </summary>
    public static real_t PosMod(real_t a, real_t b)
    {
        real_t c = a % b;
        if ((c < 0 && b > 0) || (c > 0 && b < 0)) 
        {
            c += b;
        }
        return c;
    }

(unde real_t` poate fi orice tip de număr)

0
0
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
Utilizatori
Toate
Nou
Populare
1
工藤 芳則
Înregistrat 6 zile în urmă
2
Ирина Беляева
Înregistrat 1 săptămână în urmă
3
Darya Arsenyeva
Înregistrat 1 săptămână în urmă
4
anyta nuam-nuam (LapuSiK)
Înregistrat 1 săptămână în urmă
5
Shuhratjon Imomkulov
Înregistrat 1 săptămână în urmă
ID
JA
KO
RO
RU
© kzen.dev 2023
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire