如何消除挑战“Sam and sub-strings”中与模数相关的错误?

Posted

技术标签:

【中文标题】如何消除挑战“Sam and sub-strings”中与模数相关的错误?【英文标题】:How to remove the error related to modulus in the challenge 'Sam and sub-strings'? 【发布时间】:2017-02-14 20:03:10 【问题描述】:

我在hackerrank上做了一个名为Sam and sub-strings的问题,你可以点击相应的链接查看。

这是我的代码。我确信我的程序的逻辑是正确的,因为它适用于较小的值(以及示例测试用例)。问题出在模数上,我无法在这个程序中正确使用模数。任何人都可以帮助我(如果可能,请告诉程序中何时/何处使用模数而不编辑我的程序的其余部分)? 我的提交对测试用例 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' 将数字转换为数字。 您可以通过在每个循环中维护一个乘以 10 的变量来消除对 pow 的调用。这将提高代码的性能,并且对于在线评委来说,时间是一个因素。 作为一般的经验法则,如果有模运算,就不可能有浮点pow @harold 我正在通过类型转换将浮点 pow 转换为 long long int。所以这不是问题。 @user3774008 这次肯定不是问题,只是因为指数很小。不过,这里没有理由使用它,而且一般来说,即使尝试也是危险的。 【参考方案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 函数看起来很有帮助。

【讨论】:

以上是关于如何消除挑战“Sam and sub-strings”中与模数相关的错误?的主要内容,如果未能解决你的问题,请参考以下文章

技术分享| anyRTC回声消除算法进化

技术分享| anyRTC回声消除算法进化

消除Buck转换器中的EMI问题

安卓权威编程 5.5 挑战练习

自由职业者的八大挑战

百度网盘AI大赛-水印智能消除赛第3名方案