Как построить повторяющееся уравнение? - PullRequest
3 голосов
/ 15 октября 2010

Допустим, два целых числа x и N.

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

Так что, если x был9 и N было 4, уравнение вернет 9999.И если бы х было 9, а N было 5, уравнение вернуло бы 99999. (ad nauseam)

Надеюсь, это не совсем абсурдно или неуместно на SO.:)

Ответы [ 8 ]

10 голосов
/ 15 октября 2010

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

4 голосов
/ 15 октября 2010

Обратите внимание, что 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).

2 голосов
/ 15 октября 2010

Это похоже на вопрос программирования, так как решение сильно зависит от системы счисления 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;
}
1 голос
/ 24 декабря 2010

В питоне это очень просто:

def repeat(x, N):
    return int(str(x) * N)
1 голос
/ 15 октября 2010

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

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

Скрипка: http://jsfiddle.net/SZKeb/2/

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

1 голос
/ 15 октября 2010

псевдокод:

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

пример C ++:

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 голосов
/ 15 октября 2010

Звучит так, как будто вы пытаетесь создать последовательность повторяющихся чисел, а не просто выполнять математические вычисления. Почему бы не сделать следующее (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) будет двузначным или выше?
0 голосов
/ 15 октября 2010

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

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