我的程序中有一些我需要的循环。我可以写出伪代码,但我不完全确定如何从逻辑上编写它们。
我需要-
if (num is a multiple of 10) { do this }
if (num is within 11-20, 31-40, 51-60, 71-80, 91-100) { do this }
else { do this } //this part is for 1-10, 21-30, 41-50, 61-70, 81-90
这是一个蛇和梯子的棋盘游戏,如果它对我的问题更有意义的话。
我想象一下第一个if语句,我需要使用模数。if (num == 100%10)
是正确的吗?
第二个我不知道。我可以像if (num > 10 && num is < 21 || etc.)
一样写出来,但必须有比这更聪明的东西。
发布于 2014-04-28 07:05:18
对于第一个,要检查一个数字是否为多次使用:
if (num % 10 == 0) // It's divisible by 10
对于第二个:
if(((num - 1) / 10) % 2 == 1 && num <= 100)
但这是相当密集的,而且您最好只是显式地列出这些选项。
现在你已经对你正在做的事情有了一个更好的想法,我把第二个写成:
int getRow(int num) {
return (num - 1) / 10;
}
if (getRow(num) % 2 == 0) {
}
这是相同的逻辑,但通过使用函数,我们对它的含义有了更清晰的理解。
发布于 2014-04-28 07:24:37
这是为未来的访问者准备的,而不是初学者。对于更一般的类似算法的解决方案,您可以获取一个起始值和结束值的列表,并检查传递的值是否在其中一个值内:
template<typename It, typename Elem>
bool in_any_interval(It first, It last, const Elem &val) {
return std::any_of(first, last, [&val](const auto &p) {
return p.first <= val && val <= p.second;
});
}
为简单起见,我使用了一个多态的lambda (C++14)而不是一个显式的pair
参数。这也应该坚持使用<
和==
来与标准算法保持一致,但只要Elem
为其定义了<=
,它就会像这样工作。无论如何,它可以像这样使用:
std::pair<int, int> intervals[]{
{11, 20}, {31, 40}, {51, 60}, {71, 80}, {91, 100}
};
const int num = 15;
std::cout << in_any_interval(std::begin(intervals), std::end(intervals), num);
这里有一个here的实例。
发布于 2014-04-28 08:33:28
第一个很简单。您只需对num值应用模运算符:
if ( ( num % 10 ) == 0)
由于C++会将每个不为0的数字都计算为真,因此您还可以这样写:
if ( ! ( num % 10 ) ) // Does not have a residue when divided by 10
对于第二个,我认为这更容易理解:
这个模式每20次重复一次,所以你可以计算模20。除了那些可以被20整除的元素外,所有你想要的元素都将在一行中。
要获得这些,只需使用num-1或更好的num+19来避免处理负数。
if ( ( ( num + 19 ) % 20 ) > 9 )
这是假设模式永远重复,因此对于111-120,它将再次应用,以此类推。否则,您需要将数量限制为100:
if ( ( ( ( num + 19 ) % 20 ) > 9 ) && ( num <= 100 ) )
https://stackoverflow.com/questions/23330100
复制相似问题