c++ - 为什么此代码仅在我提供的数字为零时才起作用?例如 t=1 和 string = "1012"
问题描述
在这个问题上,我要做的是:找到答案。给定字符串中的数字,它们是字符串表示的完整数字的除数。
对于其中没有 0 的数字,它工作正常。例如 t=1 , s="12" , 输出=2
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
long long t,i,n,ct;
cin>>t;
while(t--)
{
ct=0;
cin>>s;
n=stoi(s);
for(i = 0; i < s.length(); i++)
{
if(n%(s[i]-'0') == 0 && s[i] != '0')
{
ct++;
}
}
cout<<ct<<endl;
}
}
解决方案
if(n%(s[i]-'0') == 0 && s[i] != '0')
首先,这是错误的顺序。您要确保它不是'0'
在尝试除法类型操作之前。这样做的原因是 C++ 使用短路操作,因此在以下代码中,如果xyzzy
为 false,plugh
则永远不会被评估:
if (xyzzy && plugh)
如果xyzzy
是一个“危险”的操作,当它是假的时候不应该发生plugh
,你就会遇到麻烦。
在您的特定代码中,您将首先尝试在检查数字之前评估除法。因此,它将允许执行除以零,这并不是一个好主意。使用它会更安全:
if ((s[i] != '0') && (n % (s[i] - '0') == 0))
您的代码中还有一些其他小问题,例如有符号/无符号比较,或者long long
(a)的非必要使用,或者没有遵循在需要它们的地方而不是在很久之前的某个时候声明变量的准则(例如在函数的顶部)。
但是if
语句中子表达式的顺序很可能是您的直接问题。
(a)你希望这些字符串能用多久?:-)
推荐阅读
- batch-file - 无法替换包含运算符的字符串
- r - 使用 R 根据现有变量的顺序创建新变量
- javascript - 在 hapi.js 上添加 CSS 不起作用
- c# - 为什么数据记录被错误地读入列表
? - android - 如何在正常的改造调用中使用 RxJava?
- laravel - 如何在 Laravel 中输出数组 A 到数组 B 的值之间的差异?
- testing - 测试/TDD 私有方法
- arrays - 访问单个 JSON 数组项并动态用于博客文章
- excel - Excel VBA - 如何在一个工作簿的多个工作表中自动检查和选择多个列表中的重复项?
- python - 在 scikit-learn 中使用预训练的手套词嵌入