Как умножить число на себя, каждый раз меняя его?

В некой игре есть улучшения чего-то, которые имеют свою цену. При каждой покупке этого улучшения, его цена умножается на 1.15. Например, начальная стоимость улучшения 50 монет, после первой покупки, цена становится 57, после второй - 66 и т.д. xCurrentMult раз. Потом сложить все числа. (50+57+60 и т.д)
Есть так же кнопки, которые должны изменять количество апгрейдов, покупаемых за одно нажатие. Пример, при нажатии кнопки х10, цена должна изменяться соответственно. Чтобы вместо десяти нажатий кнопки, можно было купить сразу 10 апгрейдов за один клик. Повторюсь, на покупку для каждого апгрейда, цена должна применять на себя модификатор 1.15.

public int[] upgradeCost;
public int costMult = 1.15;
public int xCurrentMult = 1; //глобальная переменная, 
                             //нажатие кнопки меняет значение(х1,x10,x100)

public int UpgradeCost(string type, int UpgradeID)
    {    
        return upgradeCost[UpgradeID] * costMult; //вот эту формулу нужно изменить                                                        
    }

Думал сделать через цикл for, что-то вроде такого, но не очень получается. Ниже мой плохой пример.

public int UpgradeCost(string type, int UpgradeID)
        {    
            public int total;
            for (int i = 0; i < xCurrentMult; i++)
            {
                total += upgradeCost[UpgradeID] * costMult;
            }  
            return total;                                        
        }
        

Ответы (1 шт):

Автор решения: Максим Фисман

У вас получается геометрическая прогрессия, где каждый член равен предыдущему, умноженному на 1.15:

b1 = 50 (первый член прогрессии)
q = 1.15 (знаменатель прогрессии)

Сумма n первый членов геометрической прогрессии рассчитывается по формуле

Математически: 
S(n) = (b1 * (q^n - 1) / (q - 1)

На C#:
double sum = b1 * (Math.Pow(q, n) - 1) / (q - 1);

Но, судя по всему вам нужно округление. Причем, вы в вопросе 50 * 1.5 = 57.5 приравниваете к 57, т.е. округляете в меньшую сторону. Я использую обычное округление, вы можете изменить.

int result = 0;
for (int i = 1; i <= n; i++) {
    result += (int)Math.Round(first_elem * Math.Pow(q, i-1));
}

На выше описанных b1 и q у меня получаются ответы 1010, 1015 и 1020 при использовании функций округления Floor, Round и Ceil соответственно. Как вы насчитали 1061 мне не совсем понятно, но можно сказать что это не баг, а фича: "Купи оптом - получи скидку!!!"

→ Ссылка