ПРИМЕЧАНИЕ. Не пишите решение (т.е. алгоритмическую логику) этой проблемы.

Вчера у Шефа была отличная вечеринка, и он не помнит, как он ее праздновал. Но он нашел у себя на кухне странную бумагу, содержащую n цифр (давайте дадим им индексы от 1 до n и назовем их a1, a2 ... aN).

Шеф вспоминает, что играл в такую ​​игру:

On each step he choose an index x from 1 to n.
For all indices y (y < x) he calculated the difference by = ax - ay.
Then he calculated B1 - sum of all by which are greater than 0 and B2 - sum of all by which are less than 0.
The answer for this step is B1 - B2.

Шеф-повар помнит игру, но забыл ответ. Пожалуйста, помогите ему! Вход

The first line contains two integers n, m denoting the number of digits and number of steps. The second line contains n digits (without spaces) a1, a2, ..., an.
Each of next m lines contains single integer x denoting the index for current step.

Выход

For each of m steps print single number in a line - answer of the step.

Ограничения

1 ≤ n, m ≤ 10^5
0 ≤ ai ≤ 9
1 ≤ x ≤ n

Теперь, как мне ввести n-значный ввод? Я имею в виду, как мне использовать код scanf в этом. Я не знаю точное значение n, поэтому я не могу объявить эти многие переменные. Означает ли это, что я беру однозначный ввод? < / сильный>

-1
user3424954 7 Апр 2014 в 16:51
2
Почему такая длинная, длинная, совершенно не относящаяся к делу история? Только ваш последний абзац (полностью выделен жирным шрифтом, понимаете, как это раздражает?) имеет отношение к делу и справедливый вопрос.
 – 
Jongware
7 Апр 2014 в 17:02
Понятия не имею, что все это значит, но я четко понимаю, что ОП подозревает меня в отрицательном голосовании. Прочтите как работает система репутации. Также прочитайте Как задать хороший вопрос. Наконец, статус OP предполагает, что он не читал О Stackoverflow, дружественном введении к сайту.
 – 
Jongware
7 Апр 2014 в 23:14

3 ответа

Лучший ответ

Просто берите по одному символу за раз:

int num = getc(stdin) - '0';

Вычитание «0» превращает символ в число. Очевидно, проверка ошибок оставлена ​​как упражнение.

3
John Zwinck 7 Апр 2014 в 16:54

(при условии, что ввод из n цифр представляет собой строку с n символами) Используйте динамическое выделение памяти и настраиваемое средство форматирования scanf:

int n = 0;
char* digits = NULL;
char format[256];

printf("n=");
scanf("%d", &n);
digits = calloc(n + 1, 1); /* for the terminator 0 to be initialized*/

snprintf(format, 256, "%%%ds", n); /* to not to cause an overflow */

if(NULL == digits)
{
    printf("Not enough memory");
    exit(1);
}
scanf(format, digits);
printf("%s", digits);

// DO your algorithm here

free(digits);
0
Ferenc Deak 7 Апр 2014 в 17:06

@ user3424954 прочтите формулировку задачи еще раз, там явно упоминаются входы первой строки n, которые являются длиной числовой строки. Вы можете попробовать использовать * scanf ("% s", имя_массива); *

0
tech_boy 13 Апр 2014 в 16:45