Extraire la racine numérique d’un nombre consiste à réaliser la somme numérique de ses chiffres.
ex :
123 = 1 + 2 + 3 = 6
Cela à l’air simple comme cela, mais pour l’apprendre à un ordinateur, ce n’est pas évident. Voici donc une solution possible en Java et en Swift.
En Java ( code utilisé sur l’application thème de cristal version Android) :
————————————- code ———————————
package fr.vincent_barousse.crystaltheme;
import android.support.v7.app.AppCompatActivity;
/**
* Created by bwc on 16/12/2016.
*/
public class ReductionNum extends AppCompatActivity {
// Methodes pour la réduction numérique des nombres en base 33 ou base 10
// Méthodes traduites en java depuis swift
public int reductionNum(int nombreAReduire, int base) {
int sumPremiere = 0;
sumPremiere = sumDigits(nombreAReduire);
while (sumPremiere >= base) {
sumPremiere = sumDigits(nombreAReduire);
}
return sumPremiere;
}
private int sumDigits(int i) {
int sum = 0;
double nDigit = Math.floor(Math.log(10) * (double)(i))+1;
for (double r = nDigit; r >0; r -= 1) {
double p = Math.pow(10, r-1);
double d = Math.floor((double)(i)/p);
sum += (int)(d);
i -= (int) (d*p);
}
return sum;
} // end sumDigits
} // fin ReductionNum
—————————— / code ———————————–
et en Swift (code utilisé pour l’application IOS Theme de cristal) :
—————————— code ————————————
//
// ReductionNumerique.swift
// ThemeDeCristal
//
// Created by Vincent Barousse on 31/01/2016.
// Copyright © 2016 Vincent Barousse. All rights reserved.
//
import Foundation
import UIKit
func reductionNum(nombreAReduire: Int, base: Int) -> Int {
var sumPremiere = 0
func sumDigits(var i : Int) -> Int {
var sum = 0
let nDigits = floor(log10(Double(i))) + 1
for var r = nDigits; r > 0; r -= 1 {
let p = pow(10, r – 1)
let d = floor(Double(i) / p)
sum += Int(d)
i -= Int(d * p)
}
return sum
}
sumPremiere = sumDigits(nombreAReduire)
while sumPremiere >= base {
sumPremiere = sumDigits(sumPremiere)
}
return sumPremiere
}
——————————— /code ————————————
Un grand merci au site stackoverflow !
Mise à jour du 20/03/17 : le code en Swift 3 :
—————————— code ————————————
import Foundation
import UIKit
extension Decimal {
var doubleValue:Double {
return NSDecimalNumber(decimal:self).doubleValue
}
}
// implementation
//let d = Decimal(floatLiteral: 10.65)
//d.doubleValue
func reductionNum(_ nombreAReduire: Int, base: Int) -> Int {
var sumPremiere = 0
var sumPremiere11: Bool = false
var sumPremiere22: Bool = false
func sumDigits(_ i : Int) -> Int {
var i = i
var sum = 0
let nDigits = floor(log10(Double(i))) + 1
let nDigitsInt = Int(nDigits)
for r in ((0 + 1)…nDigitsInt).reversed() {
let p = (pow(10, r – 1))
let pDouble = p.doubleValue
let d = floor(Double(i) / pDouble)
sum += Int(d)
i -= Int(d * pDouble)
}
return sum
}
sumPremiere = sumDigits(nombreAReduire)
while sumPremiere >= base {
sumPremiere = sumDigits(sumPremiere)
// Modif for numbers 11 and 22 (master numbers)
if (sumPremiere == 11) {
sumPremiere11 = true
}
if (sumPremiere == 22) {
sumPremiere22 = true
}
// end modif for numbers 11 and 22
}
if (sumPremiere22 == true) {sumPremiere = 22}
if (sumPremiere11 == true) {sumPremiere = 11}
return sumPremiere
}
—————————— / code ————————————