Member 14060033 Ответов: 1

Зацикливание при увеличении в 2 раза


Работа над заданием с использованием c# и visual studio. Я хочу, чтобы пользователь ввел, сколько дней он работал, а оплата за каждый день отображалась в списке. Однако зарплата должна удваиваться каждый день. Итак, в первый день они получают 1 пенни, во второй-2 пенни, в третий-4 пенни и т. д. Имея проблемы с получением увеличения в 2 раза, в то же время сохраняя счет только на один день.

Что я уже пробовал:

//объявить переменные
двойной dblDays;
двойной dblPay;
int intCounter=1;



если (дважды.Метод tryparse(txtDays.Текст, из dblDays))
{
для (intCounter = 1; intCounter <= dblDays; intCounter ++)
{
dblPay = (dblDays*.01) * intCounter;
lstDays.Items.Add("оплата за день" + intCounter.ToString() + "=" + dblPay.ToString("c"));
lblTotalPayEarnedTotal.Текст = dblPay.ToString("c");

1 Ответов

Рейтинг:
0

Alek Massey

менять
dblPay = (dblDays*.01) * intCounter;
к
dblPay = (dblDays*.01) * Math.Pow(2,(intCounter-1));

потому что в математике,
2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
и т.д...


George Swan

Вы можете сделать это в одной строке с linq
Перечислимый.Диапазон(1, дней).Совокупный((р, я) =&ГТ; Р+(инт)математика.Для военнопленных(2,я));

Richard Deeming

Это не приведет к правильному результату. :)

Потому что вы начинаете диапазон в 1 в конечном итоге вы удваиваете зарплату в первый день вместо второго.

Но если вы измените диапазон, чтобы начать с 0, вы все равно получите неправильный ответ, потому что вы не предоставили начальное значение. Без начального значения, Aggregate не будет вызывать функцию агрегации по первому значению в последовательности, так что вы в конечном итоге платите ноль за первый день.

Есть несколько способов исправить это:

Enumerable.Range(0, days).Aggregate(0, (r, i) => r + (int)Math.Pow(2, i));
Enumerable.Range(0, days).Aggregate((r, i) => r + (int)Math.Pow(2, i)) + 1;
Enumerable.Range(1, days).Aggregate((r, i) => r + (int)Math.Pow(2, i - 1));
Enumerable.Range(0, days).Select(i => (int)Math.Pow(2, i)).Sum();


Однако более простым вариантом было бы избежать LINQ и просто вычислить результат напрямую:
Math.Pow(2, days) - 1;

George Swan

Отлично,Ричард. Я должен проверить, прежде чем отправить сообщение

Richard Deeming

Это с# - ^ это Xor оператор.
^ Оператор (Ссылка На C#) | Microsoft Docs[^]

Для степеней двух вам либо нужно использовать Math.Pow, или оператор сдвига влево. :)

Alek Massey

Спасибо, я думаю, что у меня был VB на мозгах, исправленный.