태그 보관물: comparison

comparison

숫자가 10의 배수인지 아니면 특정 범위 내에 있는지 확인 1-10, 21-30,

프로그램에 필요한 루프가 몇 개 있습니다. 의사 코드를 작성할 수 있지만 논리적으로 작성하는 방법을 완전히 모르겠습니다.

나는 필요하다 –

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
}