Как преобразовать каждое число в num String в int в C

Я пытался решить эту проблему на Проект Эйлер.

Это то, что я сделал до сих пор -

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
    char nums[] = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"
    int64_t sum = 1, new_sum = 0;
    int num;
    for(int i = 0; i < 988; i+= 13){
        sum = 1
        for(int j = 0; j < 13; ++j){
            //Converting nums[i] to int and storing it to num here
            sum *= num;
        }
        if (sum > new_sum){
            new_sum = sum;
        }
    }
    printf("%lld", new_sum);
}

Я не знаю, как преобразовать каждый charNum в String в целое число, я пробовал atoi и sscanf, и оба они запрашивают указатель на char.

Я получаю эти ошибки соответственно

passing argument to parameter here
int      atoi(const char *); //sum *= atoi(nums[i])
format specifies type 'int *' but the argument has type 'int' [-Wformat]
            sscanf(nums[i], "%d", num);

Любая помощь приветствуется.

Э-э, нет, поступайте умнее: умножьте первые 13 цифр, затем выполните итерацию по остальной части массива, разделите на первую цифру 13-значного подмассива и умножьте на цифру, следующую за подмассивом (это формирует следующий 13-значный подмассив). Вы получаете числовое значение цифры из символа в строке с помощью str[pos] - '0'.

Aconcagua 21.03.2022 09:54
sum — это довольно плохое имя для чего-то, что должно содержать продукт — и почему это всегда должен быть продукт новый? -> назовите это так, как есть (или будет): max_....
Aconcagua 21.03.2022 09:56

Мой плохой, ты прав. У меня есть привычка называть все суммой.

Sai Nishwanth 21.03.2022 12:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
42
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я предполагаю, что вам нужно число для каждой цифры (т.е. диапазон от 0 до 9) Если да, приведенный ниже код должен быть не слишком далек от того, что вам нужно:

char nums[] = "73167176531330624919225119674426574742355349194934969835203... (so long)...";

char *p; 
long lTheTotalCount, lTheNumber;

lTheTotalCount = 0;
for (p=nums ; *p ; p++) {
   lTheNumber = (long)(*p - '0');
   lTheTotalCount += lTheNumber;
};

Вы считаете совсем другое...

Aconcagua 21.03.2022 10:12

Да, я. Мой ответ просто для того, чтобы проиллюстрировать, как получить каждую числовую цифру строки как целое число от 0 до 9.

hmag 21.03.2022 10:51

Может быть, тогда вы более четко выразили это в описании к коду? Просто для этой цели было бы достаточно одной строки int digit = nums[position] - '0';, кстати, возможно, более интересное объяснение, почему это работает (C гарантирует, что цифры 0-9 будут следующими).

Aconcagua 21.03.2022 10:58

Вы правы - кстати, стараюсь изо всех сил, не всегда идеально, я признаю :-)

hmag 22.03.2022 08:25

Не могли бы вы попробовать следующее:

#include <stdio.h>
#include <stdlib.h>
#define N 13

int main() {
    char nums[] = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
    int64_t prod = 1, max_prod = 0;
    int num;
    int pos;
    for (int i = 0; i < sizeof nums; i += N) {
        prod = 1;
        for (int j = 0; j < N; j++){
            // Converting nums[i] to int and storing it to num here
            num = nums[i + j] - '0';
            prod *= num;
        }
        if (prod > max_prod) {
            max_prod = prod;
            pos = i;
        }
    }
    printf("max product = %ld at %.*s\n", max_prod, N, nums + pos);
}

Выход:

max product = 6270566400 at 4355766896648

Кстати, поскольку имя переменной sum вводит в заблуждение, я изменил его на prod для продукта.

Вы не завершаете скопированную строку нулем (strncpy не делает этого, если нулевой символ еще не содержится в строке). На самом деле memcpy было бы более эффективным, наиболее эффективным было бы простое копирование N символов из исходной строки: printf("%.*s", N, nums + pos);.

Aconcagua 21.03.2022 10:11
sum -> prod — так почему бы и new -> max тоже?
Aconcagua 21.03.2022 10:14

@Aconcagua спасибо за полезные предложения. Я согласен. Я обновил свой ответ соответственно. Ваше здоровье.

tshiono 21.03.2022 10:51

Если nums не кратно N, вы получаете неопределенное поведение, когда i+j выходит за пределы nums — проблема, которая уже существовала в исходном коде. Кроме того, я читал вопрос о том, что N равно 2, а вводимые цифры равны abcd, нужно проверять не только ab и cd, но и bc, что не делается как для исходного, так и для вашего кода.

Aconcagua 21.03.2022 11:03
Ответ принят как подходящий

Простое преобразование символа, представляющего цифру, в саму цифру просто выполняется с помощью

int digit = nums[position] - '0';

Язык C гарантирует для набора символов Любые, что цифры 0-9 следуют друг за другом именно в таком порядке (что не обязательно имеет место для буквенных символов, см., например, (in-?) знаменитый EBCDIC).

Как я прочитал задачу, максимум может быть в месте Любые, а не только кратном 13. Это говорит и о том, что максимум четыре последовательных цифры находятся в месте, где количество предшествующих цифр нет кратно четырем.

Кроме того, если число, если цифры не кратны 13, ваши циклы превысят границы массива nums, поэтому поведение undefined (если не кратно 13, то для последней итерации i осталось меньше 13 цифр, но j все еще пытается перебрать все 13 цифр).

Исправление обоих:

size_t sequenceLength = 13; // could be a function parameter

size_t len = strlen(nums); // sizeof would include the terminating 0 character!

if (len < sequenceLength)
{
    return 0; // if within a function, else whatever appropriate error handling
}

uint64_t max = 1; // can't have negative values anyway...
for(size_t i = 0; i < sequenceLength; ++i)
{
    max *= nums[i] - '0'; // see above
}
// now we found first possible maximum: the product of first 13 digits

uint64_t num = max;
for(size_t i = sequenceLength; i < len; ++i)
{
    // for next product, we have already included the first 12 digits
    // within the previous product!

    // but there is one surplus digit contained we need to eliminate:
    num /= nums[i - sequenceLength] - '0';

    // now we can include the yet missing one:
    num *= nums[i] - '0';

    // or as a one-liner:
    num = num / (nums[i - sequenceLength] - '0') * (nums[i] - '0');

    // TODO: update maximum, if need be, just as in your code
}

Другие вопросы по теме