프로그램에 필요한 루프가 몇 개 있습니다. 의사 코드를 작성할 수 있지만 논리적으로 작성하는 방법을 완전히 모르겠습니다.
나는 필요하다 –
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)
있지만 그것 보다 더 똑똑한 것이 있어야한다.
답변
첫 번째의 경우 숫자가 다중 사용인지 확인하려면 다음을 수행하십시오.
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) {
}
동일한 논리이지만 함수를 사용하면 의미를 더 명확하게 이해할 수 있습니다.
답변
if (num은 10의 배수) {do this}
if (num % 10 == 0) {
// Do something
}
if (num is within 11-20, 31-40, 51-60, 71-80, 91-100) {do this}
여기서 트릭은 범위 사이에서 일종의 공통성을 찾는 것입니다. 물론 “brute force”방법을 항상 사용할 수 있습니다.
if ((num > 10 && num <= 20) ||
(num > 30 && num <= 40) ||
(num > 50 && num <= 60) ||
(num > 70 && num <= 80) ||
(num > 90 && num <= 100)) {
// Do something
}
그러나 1
에서 빼면 num
범위가 있음을 알 수 있습니다.
10-19, 30-39, 50-59, 70-79, 90-99
즉, 첫 번째 숫자가 홀수 인 모든 두 자리 숫자입니다. 다음으로 이것을 표현하는 공식이 필요합니다. 10으로 나누어 첫 번째 숫자를 얻을 수 있고 2로 나눌 때 나머지 1을 확인하여 홀수인지 테스트 할 수 있습니다. 모두 합치면 :
if ((num > 0) && (num <= 100) && (((num - 1) / 10) % 2 == 1)) {
// Do something
}
길지만 유지 관리 할 수있는 코드와 더 짧은 “영리한”코드 사이의 절충안을 고려할 때 매번 더 길고 명확하게 선택합니다. 최소한 영리 해 지려고한다면 달성하려는 작업을 정확히 설명하는 의견을 포함 해주세요.
코드를 작업 할 다음 개발자가 무장하고 귀하가 사는 곳을 알고 있다고 가정하면 도움이됩니다. 🙂
답변
GCC 또는 대소 문자 범위 를 지원하는 컴파일러를 사용하는 경우 이를 수행 할 수 있지만 코드는 이식 가능하지 않습니다 .
switch(num)
{
case 11 ... 20:
case 31 ... 40:
case 51 ... 60:
case 71 ... 80:
case 91 ... 100:
// Do something
break;
default:
// Do something else
break;
}
답변
이것은 초보자보다 미래의 방문객을위한 것입니다. 보다 일반적인 알고리즘 유사 솔루션의 경우 시작 및 종료 값 목록을 가져 와서 전달 된 값이 그 중 하나 내에 있는지 확인할 수 있습니다.
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;
});
}
간단하게하기 위해 명시적인 pair
인수 대신 다형성 람다 (C ++ 14)를 사용했습니다 . 이것은 또한 아마 사용에 충실해야 <
하고 ==
표준 알고리즘과 일치하도록하지만만큼이 같은 작품 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);
여기에 라이브 예제가 있습니다 .
답변
첫 번째는 쉽습니다. 모듈로 연산자를 num 값에 적용하면됩니다.
if ( ( num % 10 ) == 0)
C ++는 0이 아닌 모든 숫자를 true로 평가하므로 다음과 같이 작성할 수도 있습니다.
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 ) )
답변
코드에 몇 가지 좋은 주석이 있으면 매우 간결하고 읽기 쉽게 작성할 수 있습니다.
// Check if it's a multiple of 10
if (num % 10 == 0) { ... }
// Check for whether tens digit is zero or even (1-10, 21-30, ...)
if ((num / 10) % 2 == 0) { ... }
else { ... }
답변
기본적으로 답변을 직접 설명했지만 경우를 대비하여 여기에 코드가 있습니다.
if((x % 10) == 0) {
// Do this
}
if((x > 10 && x < 21) || (x > 30 && x < 41) || (x > 50 && x < 61) || (x > 70 && x < 81) || (x > 90 && x < 101)) {
// Do this
}