2013-01-02 2 views
0

숫자가 증가하고 있는지 어떻게 확인할 수 있습니까? 123456 - 사실 내가 시도 423659 - 거짓숫자가 증가하고 있는지 확인 하시겠습니까?

또한
while (newNumber != 0) 
     { 

      string a = newNumber.ToString().Substring(0, 1); 
      string b = newNumber.ToString().Substring(0, 2); 

      input1 = Convert.ToInt32(a); 
      input2 = Convert.ToInt32(b); 

      if (input1 < input2) 
      { 
       ////how do i increase substring a&b +1 ? 

      } 

     } 

    } 

, 내가 문자열 방법 않고 그것을 할 수 있습니까?

+5

확인보고. – Blender

+3

숙제 같은 냄새가납니다. –

+0

다음 자릿수가 적 으면 false를 반환하고, 그렇지 않으면 루프를 종료하고 true입니다. – kenny

답변

0

문자열의 색인 i가있는 요소가 색인 1의 요소가있는 경우 요소 i-1보다 큰 지 확인할 수 있습니다.

0

이 LINQ 체인을 사용할 수 있습니다. asc1asc2은 부울 값이며 첫 번째는 true이고 두 번째는 false입니다. 체인이하는 일은 인덱스가 0이거나 인덱스가 0보다 크지 만 이전의 것보다 여전히 큰 문자가 문자열의 길이와 같은지 확인하는 것입니다. 문자열이 숫자로만 가정하면 ASCII 값은 30..39 범위에 들기 때문에 문자를 구문 분석하지 않으므로 검사에서 여전히 유효합니다.

var s1 = "123456"; 
var s2 = "423659"; 
var asc1 = s1.Where((c, i) => i == 0 || c > s1[i - 1]).Count() == s1.Length; 
var asc2 = s2.Where((c, i) => i == 0 || c > s2[i - 1]).Count() == s2.Length; 
+0

+1이 문제에 Linq를 사용하는 경우 : –

+0

-1,이 문제에 대해 Linq를 사용하는 이유는 무엇입니까? 불필요하게 읽기 어렵고 성능이 현저히 낮습니다. – jevakallio

+0

나는 이걸 @fencliff와 함께 사용한다. 나는 그것이 의미가있는 곳이면 어디든 Linq를 사용하는 것이 낫다. 그러나이 특별한 경우는 매우 무분별하다.아마도'.All()'을 사용하고 명확한 람다 변수를 사용하여 더 명확하게 할 수있을 것입니다. – Bobson

1

사용중인 방법이 좋지 않습니다. 우선, b는 항상 a보다 큽니다. 왜냐하면 여러분은 1과 2를 위치가 아닌 길이 함수에 넣기 때문입니다. 예를 들어 숫자 12345를 사용하면 a는 1이되고 b는 12가됩니다. 또한 하위 문자열 메서드는 호출 될 때 계산되므로 하위 문자열을 다시 호출하지 않고 정의한 후에 매개 변수를 수정할 수 없습니다. 이를 다음과 같이 생각하십시오. 메소드의 결과를 변수에 지정하면 메소드는 그 결과를 계산해야하므로 다른 결과가 필요하면 다시 계산해야합니다. 그러나 Substring 메서드를 전혀 사용할 필요가 없습니다. C#에서는 문자열을 인덱스로 액세스 할 수 있으므로 첫 번째 요소에 대해 myString[0]이라고 말할 수 있습니다. C#의 인덱스는 0으로 인덱싱되므로 첫 번째 항목은 인덱스 0입니다. 당신이 확인하고 무엇을 위해, 당신은과 같이, 루프를 사용할 수 있습니다

if (newNumber != 0) 
    { 

     string a = newNumber.ToString(); 

     for(int i = 1; i < a.Length; i++) 
     { 
      int input1 = Convert.ToInt32(a[i-1]); 
      int input2 = Convert.ToInt32(a[i]); 

      if (input1 >= input2) //Note the reversed condition 
      { 
       return false; //Gives the false result 

      } 
     } 
     return true; //Computation finished, so the number is increasing 
    } 

} 

이 방법은 빨리, 그리고 내가 제대로 질문을 이해 한 경우, 당신이 원하는 정확히 꽤 많은 일을해야한다. 또한 루프의 본문에서 "newNumber"를 변경하지 않아서 왜 while 루프를 사용했는지 확실하지 않습니다. 프로그램은 무언가를 멈출 때까지 루프에서 계산할 것입니다. if 문을 사용해야합니다. While 루프는 본문을 반복해서 반복하여 매번 계산을 시작하기 전에 조건을 테스트하고 if 문은 한 번만 실행됩니다. while 루프는 무한히 실행될 가능성이 있기 때문에 일반적으로 if 문을 사용할 수 있습니다. 조건이 충족되지 않는 상태가되어 영원히 반복 될 수 있기 때문입니다.

2

숫자를 stringint 사이에서 앞뒤로 변환 할 필요가 없습니다. C#에서 문자열은 문자 배열로 열거하고, 문자는 서로간에 비교할 수 : 숫자를 정렬하면 숫자를 변경하는 경우

bool IsIncreasing(int number) 
{ 
    string text = number.ToString(); 
    char previous = '0'; 

    foreach(char c in text) 
    { 
     if(c <= previous) 
      return false; 
     previous = c; 
    } 

    return true; 
} 
+0

'number'가 음수이면 '-''(빼기)를 ''0 '과 비교할 수 있습니다. 루프 이전에 NUL 문자 (''\ 0 ''라고도 알려져있는 char.MinValue)에'previous'를 초기화하는 것도 가능합니다. –

+0

아 좋은 지적이야. 나는 그 대답을 잊어 버렸다. 여기 깔끔한 해결책. – Hoeloe

관련 문제