首页 > 解决方案 > 为什么此代码仅在我提供的数字为零时才起作用?例如 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;
    }
}

标签: c++string

解决方案


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)你希望这些字符串能用多久?:-)


推荐阅读