2017-02-14 20 views
0

Я делал проблему с именем Sam and sub-strings на hackerrank, которую вы можете посмотреть, нажав соответствующую ссылку.Как удалить ошибку, связанную с модулем в вызове «Сэм и подстроки»?

Вот мой код. Я уверен, что логика моей программы верна, поскольку она работает для меньших значений (а также выборочных тестовых случаев). Проблема заключается в модуле, и я не могу получить, как правильно использовать модуль в этой программе. Может ли кто-нибудь помочь мне (если возможно, сообщите, когда/где использовать модуль в программе без редактирования остальной части моей программы)? Мое представление дает правильные результаты для testcases 0,1,2,3,12 и неверные результаты для остальных.

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 


int main() { 
    long long int n; 
    cin >> n; 

    vector<long long int> v1; 
    while (n!=0){ 
     v1.push_back(n%10); 
     n=n/10; 
    } 

    long long int x=1,s1=0,sum=0; 
    for (long long int i=v1.size()-1;i>=0;i--){ 
     s1+=x*v1[i]; 
     x++; 
     sum=(sum+(s1*(long long int)pow(10,i))%1000000007)%1000000007; 
    } 

    cout << sum << endl; 
    return 0; 
} 
+0

Рассматривали ли вы сохранение числа в виде текстовой строки? Вы можете получить цифры, используя нотацию массива. Вы можете преобразовать цифру в число, вычитая «0». –

+0

Вы можете устранить вызовы 'pow', поддерживая переменную, которая умножается на 10 в каждом цикле. Это улучшит производительность вашего кода и онлайн-судей, время - фактор. –

+1

Как правило, если есть модульная арифметика, не может быть также и плавающая точка 'pow'. – harold

ответ

1

Предлагаю вам обрабатывать номер как текст при игре цифрами.

int main() 
{ 
    std::string number_as_text; 
    std::cin >> number_as_text; 

    long long sum = 0; 
    const std::string::size_type length = number_as_text.length(); 
    for (unsigned int index = 0; index < length; ++index) 
    { 
     long long s1 = (number_as_text[index] - '0') * (index + 1); 
     sum = sum * 10 + s1; 
    } 
    return 0; 
} 

Вы должны будете выяснить, где поставить Mod 1000000007 в вашей программе, если вам нужно.

Кроме того, я рекомендую разместить обработку ошибок в коде, особенно при чтении в номере. Функция std::isdigit выглядит полезной.