如何消除挑战“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”中与模数相关的错误?的主要内容,如果未能解决你的问题,请参考以下文章