Lorsque la fonction récursive se déclenche et renvoie les résultats en haut, elle se bloque en raison d'un débordement de données. Comment puis-je utiliser cet algorithme D & C et éviter ce problème?Comment éviter la multiplication par débordement de très grands nombres avec fonction récursive (C#, D & C)
static long long zarb(long a, long b, int n)
{
Int64 w, x, y, z;
int s;
if (a == 0 || b == 0)
return 0;
if (n <25)
return a * b;
else
{
s = n/2;
long p = power(2, s);
w = a/p;
x = a % p;
y = b/p;
z = b % p;
return (zarb(w, y, n/2) * power(2, 2 * s) + p * (zarb(w, z, n/2) + zarb(x, y, n/2)) + zarb(x, y, n/2));
}
}
static long power(int x, int y)
{
long sum = 1;
if (y == 0)
return 0;
for (int i = 1; i <= y; i++)
sum = sum * x;
return sum;
}
Dépassement de type de données long? Quelle est l'exception que vous obtenez? Est-ce 'OverflowException' ou' StackOverflowException'? –
Alors, que voulez-vous exactement que le comportement soit? Empêcher qu'il ne s'écrase est facile, mais comment voulez-vous qu'il soit géré? –
'static long long' c'est C#, pas C. Il n'y a pas de' long long' ici. Et c'est mieux si vous ne mélangez pas Int64 et Long. Ils sont la même chose, mais cela donne un mauvais sentiment au lecteur. – xanatos