如何检查数字是否为十进制并在此处应用



如果vector a中给定元素的总和除以2是整数,则我的代码运行良好,但如果是双精度,则会失败。所以我需要检查和是否是双的,是否返回false。我试着做了,但没用。TestCase a= [1,2,3,5]在此失败

bool isPresent(vector<int>& a, vector<int>& v, const double& sum, int i) {
int n = a.size();

if(i == n) return false;
if(int(sum) != (sum)) return false; // i tried like this but not working
if(accumulate(v.begin(), v.end(), 0) == sum) return true; 

if(a[i] <= sum) {
v.push_back(a[i]);
for(auto i=v.begin();i!=v.end();i++)
cout << *i <<" ";
cout << 'n';
if(isPresent(a, v, sum, i+1)) 
return true;
v.pop_back();
}
if(isPresent(a, v, sum, i+1))
return true;
return false;
}
bool canPartition(vector<int>& a) {
vector<int> v;
int n = a.size();
int s=0;
for(int i=0;i<n;i++) {
s += a[i];
}
double sum = (double)(s/2);
if((int)sum != sum) return false; // also here
return isPresent(a, v, sum, 0);
}
int sum = (double)(s/2);

这取s并将其(作为整数(除以2(截断(,然后将确定的整数结果强制转换为double,然后将结果存储回int,CCD_8再次截断。考虑

double sum = ((double)s) / 2.0;

但是你可以通过检查模来避免通过double,这告诉你除法下的余数。

if (s % 2 != 0) return false;
int sum = (double)(s/2);
if((int)sum != sum) return false; // also here

就像其他答案提到的一样,这是一个糟糕的演员阵容(应该是s/2.(。然而,实际上你根本不需要这么做。检查是否可以平均除以二的更好方法是检查除法的余数:

if(s % 2 != 0) { return false; }

Mod(%(将两个数字相除,得到余数。因此,如果mod(或余数(不为0,那么我们就不能平分。


还要注意

if(isPresent(a, v, sum, i+1))
return true;
return false;

可以只是

return isPresent(a, v, sum, i+1);

除了OP注意到的bug之外
。。。潜在错误:当CCD_ 13不在CCD_。

const double& sum
...
if(int(sum) != (sum)) return false;  // Problem code

相反,使用modf()返回小数部分。

#include <cmath>
double whole;
double fraction = modf(sum, &whole);
if (fraction != 0.0) return false;

相关内容

  • 没有找到相关文章

最新更新