2010-10-14 2 views
3

Предположим, что два целых числа x и N.Как построить повторяющееся уравнение?

Я пытаюсь определить, как построить алгоритм, который вернет целое число значения x, повторяющегося N раз.

Так что если х было 9 и N было 4, то уравнение будет возвращать 9999.
И если х было 9 и N было 5, то уравнение будет возвращать 99999. (объявление оскомину)

Я надеюсь, что это ISN абсолютно абсурдным или неуместным на SO. :)

+3

Я думаю, программисты не знакомы с понятием уравнений;) –

+1

«рациональное число» является излишним. Все целые числа являются рациональными. :-) –

+2

Как насчет значений 'x' больше 9? – Svante

ответ

4

Обратите внимание, что x является целым числом, и оно не должно быть 1-значным числом в системе base-10. Что, если N = 3 и x = 12? Тогда ответ должен быть 121212.

Вот решение: нам нужна длина p числа x в системе base-10. Пусть p = floor(lg(x)+1). Номер, который мы ищем, - x + x*10^p + x*10^2p + ... + x*10^(N-1)p. Это x * (10^(pN) - 1)/(10^p - 1).

+0

Я еще не дважды проверял этот ответ, но он выглядит более правильным, чем предыдущий, и это алгебраическое выражение, как мне нужно. Благодаря! –

0

Псевдо-код для подражания. Суть это вы собираетесь подсчитывать п и каждый раз, когда вы рассчитывать вы будете печатать свой х

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

это не совсем «построение» целого числа, это просто печать строки, которая может и не быть тем, что хочет OP –

+0

@armen очень верно. I shoudlve прочитал вопрос лучше – 2010-10-14 20:53:21

+0

Не говоря уже о том, что код неправильный :) –

1

псевдокод:

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 

С ++ пример:

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 мало сложный для того, что необходимо. – 2010-10-14 20:52:10

+1

после рассмотрения того, что необходимо, я чувствую, что ваш psuedocode - гораздо лучший пример. – 2010-10-14 20:56:53

+1

@ george9170: зачем спасибо :) –

2

Это похоже на вопрос программирования, так как решение сильно зависит от системы номеров base-10. Алгоритм для этого просто будет простым циклом над N, который умножает предыдущее число и добавляет x.

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

Это заставило меня задуматься о правильном пути! спасибо :) –

+2

На самом деле решение Диалектика ниже лучше, создайте целое число, которое составляет все 1 и N длинное произведение, которое с x. – fairidox

1

Просто чтобы быть немного по-другому, я сделал скрипку JavaScript с этой рекурсивной функции:

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

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

Он просто работает в обратном направлении от N, так что по существу будет рассчитать как 9000 + 900 + 90 + 9 + 0 = 9999

10

Это работает для меня: (10^N-1)/9 * x

+0

+1, избили меня на минутку! –

+0

@Dialecticus: +1: Cool :) –

+0

Что делать, если N равно 11 и x равно 12? Это уравнение даст 133 333 333 332. – Thorin

0

Звучит скорее как вы пытаетесь построить строку повторяющихся чисел, чем выполнять фактическую математику. Почему бы не сделать следующее (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." 

Этот пример показывает несколько вещей, которые вы хотите следить за:

  1. ли создаваемый результат допустимым числом для любого языка программирования вы в?
  2. Что делать, если целое число для повторения (x) является двузначным числом или выше?
1

В питона, это очень легко:

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

Или в форме лямбда: 'lambda x, N: int (str (x) * N)' – mattbasta

Смежные вопросы