2010-10-14 3 views
3

Supposons deux entiers x et N.Comment construire une équation récurrente?

J'essaie de déterminer comment construire un algorithme qui retournerait un entier de la valeur x répété N fois.

Donc, si x était 9 et N était 4, l'équation retournerait 9999.
Et si x était 9 et N était 5, l'équation retournerait 99999. (ad nauseam)

J'espère que ce ISN pas complètement absurde ou hors de propos sur SO. :)

+3

Je suppose que les programmeurs ne sont pas familiers avec le concept d'équations;) –

+1

"entier rationnel" est redondant. Tous les entiers sont rationnels. :-) –

+2

Qu'en est-il des valeurs 'x' supérieures à 9? – Svante

Répondre

4

Notez que x est un nombre entier et qu'il ne doit pas nécessairement s'agir d'un nombre à un chiffre dans le système base-10. Que faire si N = 3 et x = 12? Ensuite, la réponse devrait être 121212.

Voici la solution: nous avons besoin de la longueur p du nombre x dans le système base-10. Laisser p = floor(lg(x)+1). Le numéro que nous recherchons est x + x*10^p + x*10^2p + ... + x*10^(N-1)p. C'est x * (10^(pN) - 1)/(10^p - 1).

+0

Je n'ai pas encore revérifié cette réponse, mais il semble plus correct que le le précédent, et c'est une expression algébrique comme j'ai besoin. Merci! –

0

Pseudo-code à suivre. L'essence de c'est que vous allez compter jusqu'à n et chaque fois que vous comptez vous imprimer votre x

for(int i=1; i <=x ; i++) 
{ 
system.print("n"); 
} 
+0

ce n'est pas exactement "construire" l'entier, c'est juste l'impression d'une chaîne, ce qui peut ne pas être ce que l'OP veut –

+0

@armen très vrai. Je devrais lire la question mieux –

+0

Sans compter que le code est incorrect :) –

1

pseudocode:

Procedure Construct takes x:integer N:integer 
begin 
    take a variable Result and initialize with 0; 
    For N times Do 
    begin 
     Result <- Result * 10 
     Result <- Result + x 
    end 
end 

un C++ par exemple:

int main() 
{ 
    const int x = 9, N = 5; 
    int Result = 0; 
    for(int i = 0; i < N; ++i) 
    { 
     Result*=10; 
     Result+=x; 
    } 
    //use result here 
} 
+0

tsirunyan peu compliqué pour ce qui est nécessaire. –

+1

après avoir examiné ce qui est nécessaire, je pense que votre code psuedocode est un meilleur exemple. –

+1

@ george9170: pourquoi merci :) –

2

Cela ressemble plus à une question de programmation, car la solution dépend fortement du système de numéro de base-10. L'algorithme pour ce faire serait simplement une simple boucle sur N qui multiplie le nombre précédent et ajoute un x.

int foo(int x, int N) { 
    int result = 0; 
    for(i=0; i<N; i++) { 
    result *= 10; 
    result += x; 
    } 
    return result; 
} 
+0

cela m'a fait penser sur le bon chemin! merci :) –

+2

En fait, la solution de Dialecticus ci-dessous est meilleure, créez un entier qui est tout 1s et N de long, produit qu'avec x. – fairidox

1

juste être un peu différent, je l'ai fait un violon JavaScript avec cette fonction récursive:

function repeating(x, n){ 
    return (n) ? (x * Math.pow(10,n-1)) + repeating(x, n-1) : 0; 
}; 

Fiddle: http://jsfiddle.net/SZKeb/2/

Il fonctionne en arrière de N, donc essentiellement volonté calculer comme 9000 + 900 + 90 + 9 + 0 = 9999

10

Cela fonctionne pour moi: (10^N-1)/9 * x

+0

+1, me battre d'une minute! –

+0

@Dialecticus: +1: Cool :) –

+0

Et si N est 11 et x est 12? Cette équation donnerait 133 333 333 332. – Thorin

0

Semble plus que vous essayez de construire une chaîne de nombres répétitifs que de faire des mathématiques réelles. Pourquoi ne pas faire ce qui suit (C#)?

using System; 
using System.Text; 

public int CreateInt(int x, int N) 
{ 
    StringBuilder createdString = new StringBuilder(); 
    int createdInt; 

    for (int i = 0; i < N; i++) 
     createdString.Append(x.ToString()); 

    if (!int.TryParse(createdString.ToString(), out createdInt)) 
     throw new Exception(string.Format("Value x ({0}) repeated N ({1}) times makes {2}. This is not a valid integer.", x, N, createdString)); 

    return createdInt; 
} 

int createdInt1 = CreateInt(7, 5); // output: 77777 
int createdInt2 = CreateInt(14, 4); // output: 14141414 
int createdInt3 = CreateInt(1, 20); // output: throws exception "Value x (1) repeated N (20) times makes 11111111111111111111. This is not a valid integer." 

Cet exemple montre deux choses que vous voulez regarder pour:

  1. Le résultat est créé un entier valide quelle que soit la langue que vous programmez en?
  2. Que se passe-t-il si l'entier à répéter (x) est à deux chiffres ou plus?
1

En python, c'est super facile:

def repeat(x, N): 
    return int(str(x) * N) 
+0

Ou sous forme lambda: 'lambda x, N: int (str (x) * N)' – mattbasta

Questions connexes