Personne n'a discuté de la version BigInteger. Pour cela, je regarderais 10 1 , 10 2 , 10 4 , 10 8 et ainsi de suite jusqu'à ce que vous trouviez les 10 derniers 2 n qui est inférieur à votre valeur. Prenez votre nombre div et modérez 10 2 n pour obtenir 2 valeurs plus petites. Laver, rincer et répéter récursivement. (Vous devriez conserver vos carrés itérés de 10 dans un tableau, et dans la partie récursive transmettre l'information sur la prochaine puissance à utiliser).
Avec un BigInteger à k chiffres, la division par 10 est O(k). Par conséquent, trouver la somme des chiffres avec l'algorithme naïf est O(k 2 ).
Je ne sais pas ce que C# utilise en interne, mais les algorithmes non naïfs qui existent pour multiplier ou diviser un entier de k bits par un entier de k bits fonctionnent tous en temps O(k 1.6 ) ou mieux (la plupart sont beaucoup, beaucoup mieux, mais ont une surcharge qui les rend pires pour les "petits grands entiers"). Dans ce cas, préparer votre liste initiale de puissances et la diviser une fois prend des temps O(k 1.6 ). Cela vous donne 2 problèmes de taille O((k/2) 1.6 ) = 2 -0.6 O(k 1.6 ). Au niveau suivant, vous avez 4 problèmes de taille O((k/4) 1.6 ) pour un autre 2 -1.2 O(k 1.6 ) travail. Additionnez tous les termes et les puissances de 2 se transforment en une série géométrique convergeant vers une constante, de sorte que le travail total est de O(k 1.6 ).
Il s'agit d'un avantage certain, et cet avantage sera très, très évident si vous travaillez avec des nombres à plusieurs milliers de chiffres.