2015-11-29 22 views
3

我設法檢查一個整數是否從右到左排序,但我怎樣才能從左到右檢查?也許我應該做兩個功能,一個從左到右檢查,另一個檢查從右到左?例如,我用第二個函數替​​換return 0;,該函數檢查它是否從左到右排序。我相信這會起作用。但有沒有另一種方法來檢查兩端而不使用其他功能?數字如何檢查整數是否排序(雙方)

例被整理:

1234 
4321 
4332 
2334 

這些不排序:

1232 
4325 
4334 
2332 
+0

例如返回1如果從左到右排序,則-1如果從右到左排序,則返回0否則返回0 –

+0

也許返回'bool'? – Martin

回答

0

你不能與你給予相同的功能,但簡單的解決方案,我覺得這樣做是使用一個標誌變量。除了檢查遞增順序檢查遞減順序,併爲它們提供不同的標誌值並返回標誌。這會做。

4

此功能檢查兩個方向:

int IsDigitsInNumberSorted(int num) 
{ 
    int leftToRight = 0; 
    int rightToLeft = 9; 
    while(num > 0) { 
     const int digit = num % 10; 
     num = num/10; 
     if(leftToRight <= digit) { 
      leftToRight = digit; 
     } else { 
      leftToRight = 10; 
      if(rightToLeft == -1) { 
       return 0; 
      } 
     } 
     if(digit <= rightToLeft) { 
      rightToLeft = digit; 
     } else { 
      rightToLeft = -1; 
      if(leftToRight == 10) { 
       return 0; 
      } 
     } 
    } 
    return 1; 
} 
2

您可以使用額外的delta檢查,如果數字在相同的順序或不改變。

例,

#include <stdio.h> 

int digitSorted(int num) 
{ 
    int i, rightDigit, nextDigit; 
    int delta_1 = 0, delta_2 = 0; 
    rightDigit = num % 10; 
    num /= 10; 
    while(num != 0) 
    { 
     nextDigit = num % 10; 
     delta_2 = nextDigit - rightDigit; // << what is the difference between two adjacent digits 
     if(delta_1 * delta_2 < 0) // << if direction changes, then it is not sorted 
      return 0; 
     rightDigit = nextDigit; 
     num /= 10; 
     if(delta_2 != 0) 
      delta_1 = delta_2; // << save previous change 
    } 
    return 1; 
} 

int main() 
{ 
    int x = 12345; 
    printf("x = %d, sorted = %d\n", x, digitSorted(x)); 

    int y = 123453; 
    printf("y = %d, sorted = %d\n", y, digitSorted(y)); 

    int z = 54321; 
    printf("z = %d, sorted = %d\n", z, digitSorted(z)); 

} 

輸出:

x = 12345, sorted = 1 
y = 123453, sorted = 0 
z = 54321, sorted = 1 
+0

如果您關心的只是符號,則可以刪除'delta_1 = delta_2;'行,因爲如果符號發生更改,則返回。 編輯:啊,剛剛注意到你的增量被初始化爲0. –

+0

是的,它是如何工作的。你需要這個來跟蹤相鄰數字之間的差異。如果方向發生任何變化(例如上升然後下降,反之亦然),則「delta_1 * delta_2」變爲負數,然後檢測到未分類的數字。 – artm

+0

我的意思是一旦初始化爲非零值,標誌將永遠不會改變。你會在更新之前返回。可能你可以將這條線吊出循環。但我現在看到你的初始化,這將是不方便的。 –

-2

解決方案:

#include <stdio.h> 
#include <conio.h> 
#include <math.h> 


int leftToRight(int num); 
int RightToLeft(int num); 
int isSorted = 0; 

int main() 
{ 

    int num1; //Variable decleration 
    printf("Please enter a number: "); //output a string 
    scanf("%ld", &num1); //input a number 
    leftToRight(num1); 
    if (isSorted == 0) 
     printf("It is sorted"); 
    else 
     printf("It is not sorted."); 

    getch(); 
} 

int leftToRight(int num) 
{ 
    int rightDigit, nextDigit; 
    rightDigit = num % 10; 
    int temp = num; 
    num /= 10; 
    while (num != 0) 
    { 
     nextDigit = num % 10; 
     if (nextDigit > rightDigit) 
      isSorted--; 
     rightDigit = nextDigit; 
     num /= 10; 
    } 
    if (isSorted == 0) 
     return isSorted; 
    else 
     RightToLeft(temp); 
} 

int RightToLeft(int num) 
{ 
    isSorted = 0; 
    int rightDigit, nextDigit; 
    rightDigit = num % 10; 
    num /= 10; 
    while (num != 0) 
    { 
     nextDigit = num % 10; 
     if (nextDigit < rightDigit) 
      isSorted--; 
     rightDigit = nextDigit; 
     num /= 10; 
    } 
    return isSorted; 
} 
+1

很確定這不會編譯,但我可能是錯的......從'RightToLeft'的返回值沒有用在'leftToRight' ....另外如果用戶首先調用'RighToLeft'會怎麼樣? – pinkfloydx33

+0

@ pinkfloydx33我檢查了它。它工作得很好。 –

+0

@ pinkfloydx33它首先進入leftToRight,如果沒有從左到右排序,它會檢查它是否從RightToLeft排序。 –

1

這個怎麼樣?

如果您願意使用C++方式,此解決方案將爲您工作。

#include <iostream> 
#include <sstream> 
#include <algorithm> 
#include <string> 

struct Comp{ 
    Comp():result(true),c_prev(0){} 
    bool result; 
    char c_prev; 
    void operator()(char& c){ 
     if(c_prev == 0){ 
      c_prev=c; 
      return; 
     } 
     if(!isdigit(c)) //to handle '-' or '+' 
      return; 
     result &= c_prev<=c; 
     c_prev = c; 
    } 
}; 

bool digitSorted(int num, bool left2right=true){ 
    std::ostringstream sst; sst<<num; 
    std::string str = sst.str(); 
    Comp result; 
    if(left2right) 
     result = std::for_each(str.begin(), str.end(), Comp()); 
    else 
     result = std::for_each(str.rbegin(), str.rend(), Comp()); 

    return result.result; 
} 
+1

你的權利,謝謝。 –

+0

無論如何,這是一個有趣的解決方案! – usr2564301