Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
Stick
4 / 4 / 0
Регистрация: 26.11.2009
Сообщений: 123
#1

Инкремент значения строки - C#

26.01.2017, 15:19. Просмотров 321. Ответов 12
Метки нет (Все метки)

Здравствуйте!
Есть строка
AB
нужно увеличить эти символы в лексикографическом значении: например АВ + 2 = AD
При переходе через "Z" ведущие символы должны тоже увеличиваться AZ + 3 = BC
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2017, 15:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инкремент значения строки (C#):

Инкремент значения переменной - C#
Уважаемые форумчане, разъясните пожалуйста ответ компилятора int i = 3; int y = ++i + i++ + i++ + ++i + ++i + i++; ...

Префиксный/постфиксный инкремент - C#
Почему следующий код выводит на консоль 13 - понятно (т.к. в первую очередь поочередно выполняются операции инкремента, а потом...

Инкремент повторяющегося числа - C#
Добрый день. Нужно решить одну небольшую задачку, для формирования XML, но у меня ничего не получается... Вообщем допустим у нас есть...

Одновременный инкремент в многопоточной программе - C#
Подпрограмма выполняется в многопоточном режиме. i, j - глобальные переменные. Каждый поток инкриминирует j и получает уникальный i. И...

Инкремент и декремент без циклов - C#
Доброго времяни суток - как можно решить такую задачку без использования циклов еще каким нибудь способом? int i =...

Префиксный инкремент: почему вывод i начинается с 0? - C#
const int n = 6; int a = new int { 1, 5, 7, 9, 8, 5 }; for(int i = 0; i < n; ++i) { Console.WriteLine("i={0}\t{1}" , i, a); ...

12
Pikemaster
297 / 297 / 120
Регистрация: 24.09.2013
Сообщений: 769
Завершенные тесты: 4
26.01.2017, 15:42 #2
Stick,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Text;
 
class Program
{
    public static void Main()
    {
        string text = "AB";
        Console.WriteLine(Increment(text, 10));
        Console.ReadKey();
    }
 
    static string Increment(string target, int num)
    {
        StringBuilder sb = new StringBuilder(target);
        for (int i = target.Length - 1; i >= 0; i--)
        {
            while (sb[i] != 'Z' && num > 0)
            {
                sb[i] = (char)(sb[i] + 1);
                num--;
            }
        }
 
        if (num > 0)
        {
            for (int i = 0; i < num / 26; i++)
                sb.Insert(0, 'Z');
            sb.Insert(0, (char)(num % 26 + 64));
        }   
        return sb.ToString();
    }
}
1
ata
268 / 240 / 53
Регистрация: 28.10.2015
Сообщений: 709
26.01.2017, 15:54 #3
Фактически речь идет о 26-ричной системе счисления. Поэтому самый простой путь - переводить строку в число, увеличивать и переводить обратно в строку. Или представлять число в виде массива байтов, а из строки в массив и из массива в строку тоже переводить двумя функциями. Строки вообще не подходят для их изменения, они иммутабельны.
0
Stick
4 / 4 / 0
Регистрация: 26.11.2009
Сообщений: 123
27.01.2017, 12:02  [ТС] #4
Pikemaster, а если исходная строка AZZ, то результат BZZ, вместо BAA.
0
Pikemaster
297 / 297 / 120
Регистрация: 24.09.2013
Сообщений: 769
Завершенные тесты: 4
27.01.2017, 12:45 #5
Stick, невнимательно прочитал задание.
Видимо тогда лучше использовать метод, который предложил ata.

Добавлено через 21 минуту
Stick, хотя можно и так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
static string Increment(string target, int num)
{
    StringBuilder sb = new StringBuilder(target);
    for (int i = 0; i < num; i++ )
    {
        if (sb[sb.Length - 1] == 'Z')
        {
            sb[sb.Length - 1] = 'A';
            for (int j = sb.Length - 2; j >= 0; j--)
            {
                if (sb[j] < 'Z')
                {
                    sb[j] = (char)(sb[j] + 1);
                    break;
                }
                else
                    sb[j] = 'A';
            }
        }
        else 
            sb[sb.Length - 1] = (char)(sb[sb.Length - 1] + 1);
    }
    return sb.ToString();
}
0
ata
268 / 240 / 53
Регистрация: 28.10.2015
Сообщений: 709
28.01.2017, 09:26 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Linq;
using System.Collections.Generic;
 
public class Kata
{
    public static void Main()
    {
        string s = "ZZZ";
        Stack<int> digits = new Stack<int>(s.Length + 1);
        int previous = 1;
        foreach (char ch in s.Reverse())
        {
            int digit = ch - 'A' + previous;
            previous = digit / 26;
            digits.Push(digit % 26);
        }
        if (previous != 0) digits.Push(previous);
        Console.WriteLine(new String(digits.Select(d => (char)(d + 'A')).ToArray()));
    }
}
Код получился почти универсальным. Его чуть-чуть доработать (заменить последнее условие на цикл), и он будет складывать со строкой любые числа. Попробуйте, например, задать s = "AA" и previous = 26.
1
Stick
4 / 4 / 0
Регистрация: 26.11.2009
Сообщений: 123
31.01.2017, 10:27  [ТС] #7
ata, изящно получилось!

Добавлено через 11 минут
ata, что-то не получается: если взять s = "Z" и previous = 3 получаю BC, вместо АС
0
TopLayer
716 / 539 / 206
Регистрация: 23.10.2016
Сообщений: 1,273
Завершенные тесты: 7
31.01.2017, 10:45 #8
C#
1
if (previous != 0) digits.Push(previous - 1);
2
Stick
4 / 4 / 0
Регистрация: 26.11.2009
Сообщений: 123
31.01.2017, 11:18  [ТС] #9
Можно ли сравнить в лексикографическом порядке строки "BE" и "BDDD". И при этом узнать какая строка меньше?
C#
1
2
3
4
5
6
7
8
if (String.CompareOrdinal("BE", "BDDD") != 1)
{
   // BE меньше
}
else
{
   // BDDD больше
}
не слишком помогает это условие.
0
Usaga
Эксперт .NET
2809 / 2390 / 425
Регистрация: 21.01.2016
Сообщений: 9,104
Завершенные тесты: 2
31.01.2017, 11:22 #10
Stick, CompareOrdinal возвращает отрицательное число, 0 и положительное число. Твоё сравнение бессмысленно.
0
Stick
4 / 4 / 0
Регистрация: 26.11.2009
Сообщений: 123
31.01.2017, 11:50  [ТС] #11
Usaga, есть ли класс или метод который мне поможет?
0
Usaga
Эксперт .NET
2809 / 2390 / 425
Регистрация: 21.01.2016
Сообщений: 9,104
Завершенные тесты: 2
31.01.2017, 11:57 #12
Stick, да, это - String.CompareOrdinal.
0
Stick
4 / 4 / 0
Регистрация: 26.11.2009
Сообщений: 123
31.01.2017, 12:44  [ТС] #13
Usaga, все ясно! Для понимания не хватало плотного обеда
0
31.01.2017, 12:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2017, 12:44
Привет! Вот еще темы с ответами:

Префиксный инкремент в качестве аргумента метода - C#
Уходит в бесконечный цикл. Причем если использовать постфиксную форму то все нормально. Непонятен механизм срабатывания (ведь при...

Почему не работает инкремент в многопоточном коде? - C#
Имеем такой код, который вызывает два потока, в асинхронном режиме, которые изменяют одну переменную, которая передаётся по ссылке. ...

Почему постфиксный инкремент так работает? - C#
Почему выводит 4 , а не 3, если постфиксный имеет низкий приоритет? public void Method() { int k = 1; Console.WriteLine(k++...

Инкремент (++), увеличить каждый элемент матрицы на единичку - C#
Всем добрый вечер! Помогите увеличить каждый элемент матрицы на единичку. Матрицу то я создал , а вот инкремент сделать не могу. Буду...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru