我設法檢查一個整數是否從右到左排序,但我怎樣才能從左到右檢查?也許我應該做兩個功能,一個從左到右檢查,另一個檢查從右到左?例如,我用第二個函數替換return 0;
,該函數檢查它是否從左到右排序。我相信這會起作用。但有沒有另一種方法來檢查兩端而不使用其他功能?數字如何檢查整數是否排序(雙方)
例被整理:
1234
4321
4332
2334
這些不排序:
1232
4325
4334
2332
我設法檢查一個整數是否從右到左排序,但我怎樣才能從左到右檢查?也許我應該做兩個功能,一個從左到右檢查,另一個檢查從右到左?例如,我用第二個函數替換return 0;
,該函數檢查它是否從左到右排序。我相信這會起作用。但有沒有另一種方法來檢查兩端而不使用其他功能?數字如何檢查整數是否排序(雙方)
例被整理:
1234
4321
4332
2334
這些不排序:
1232
4325
4334
2332
你不能與你給予相同的功能,但簡單的解決方案,我覺得這樣做是使用一個標誌變量。除了檢查遞增順序檢查遞減順序,併爲它們提供不同的標誌值並返回標誌。這會做。
此功能檢查兩個方向:
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;
}
您可以使用額外的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
如果您關心的只是符號,則可以刪除'delta_1 = delta_2;'行,因爲如果符號發生更改,則返回。 編輯:啊,剛剛注意到你的增量被初始化爲0. –
是的,它是如何工作的。你需要這個來跟蹤相鄰數字之間的差異。如果方向發生任何變化(例如上升然後下降,反之亦然),則「delta_1 * delta_2」變爲負數,然後檢測到未分類的數字。 – artm
我的意思是一旦初始化爲非零值,標誌將永遠不會改變。你會在更新之前返回。可能你可以將這條線吊出循環。但我現在看到你的初始化,這將是不方便的。 –
解決方案:
#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;
}
很確定這不會編譯,但我可能是錯的......從'RightToLeft'的返回值沒有用在'leftToRight' ....另外如果用戶首先調用'RighToLeft'會怎麼樣? – pinkfloydx33
@ pinkfloydx33我檢查了它。它工作得很好。 –
@ pinkfloydx33它首先進入leftToRight,如果沒有從左到右排序,它會檢查它是否從RightToLeft排序。 –
這個怎麼樣?
如果您願意使用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;
}
你的權利,謝謝。 –
無論如何,這是一個有趣的解決方案! – usr2564301
例如返回1如果從左到右排序,則-1如果從右到左排序,則返回0否則返回0 –
也許返回'bool'? – Martin