2016-11-02 57 views
1

我試圖寫生成1 3的情況下,簡單的C程序:如何檢查一個整數中相同的數字而不使用數組?

  1. 沒有相鄰數字的相同的整數。
  2. 具有一對相同的相鄰數字的整數。
  3. 一個具有相同相鄰數字的單個三重奏的整數。

在整數值不符合任何一種情況下的要求後,整數將增加1,然後再次檢查。

條件:用戶在1-3之間輸入一個選項,起始整數值是一個非負整數,並且生成的值大於用戶輸入的起始整數值。

注意:我可能不使用涉及數組或字符串的方法。遞歸是允許的,但是我的教授不鼓勵它的使用。

我目前的問題是確定如何比較輸入的整數值中的數字而不爲每個數字創建一個新變量。這是我到目前爲止有:

int getOption() //retrieves the option entered by the user 
{ 
    int option; 
    do 
    { 
    printf("\nEnter desired option: "); 
    scanf("%d", &option); 
    if (option <= 0 || option > 3) 
    { 
     printf("\nError! Invalid option selected!!\n"); 
    } 
    }while(option <= 0 || option > 3); 
    return(option); 
} 

int getStart() //retrieves the starting integer value entered by the user 
{ 
    int startValue; 
    do 
    { 
    printf("\nEnter starting integer: "); 
    scanf("%d", &startValue); 
    if (startValue <= 0) 
    { 
     printf("\nError! Non-negative values only!!\n"); 
    } 
    }while(startValue <= 0); 
    return(startValue); 
} 

int checkSame(int startValue); //checks if the user-given integer has any pairs of same adjecent digits. 
{ 
int counter; 
int sameAdjacent = 0; 
while (sameAdjacent < 1) 
{ 
    while(startValue > 0) 
    { 
    startValue = startValue % 10; 
    counter++; 
    } 
    for(startValue; startValue > 0; startValue/10) 
    { 
    //????? 

    } 


    } 
} 

這裏是一個什麼樣的正確執行看起來像一些例子:

1. No adjacent digits the same. 
2. A single pair of adjacent digits the same. 
3. A single trio of adjacent digits the same. 
Enter desired option: 1 
Enter starting integer: 1222 
Next larger value with no two adjacent digits the same is 1230. 

1. No adjacent digits the same. 
2. A single pair of adjacent digits the same. 
3. A single trio of adjacent digits the same. 
Enter desired option: 2 
Enter starting integer: 133300 
Next larger value with only a single pair of digits the same is 133401. 

1. No adjacent digits the same. 
2. A single pair of adjacent digits the same. 
3. A single trio of adjacent digits the same. 
Enter desired option: 3 
Enter starting integer: 123456 
Next larger value with only a single trio of digits the same is 123555. 

任何幫助表示讚賞。謝謝!

回答

4

因爲這是你大概的意思來解決你自己的,讓我給一個提示,讓你在正確的軌道上的分配:

  • 如果x是一個整數變量,則:
    • x % 10給你x最後的基10位,和
    • x = x/10砍掉的x最後一位。

另外請注意,您可以節省x的最後一位另一個變量你砍它關閉之前。事實上,通過這種方式,您可以輕鬆地保存兩個(或更多!)最近切斷的數字,只需每個數字都有一個變量即可。

如果這不是一個足夠的提示,讓我知道你仍然卡在哪裏,我會嘗試給予更多的幫助。


OK,既然你說你還是卡住了,讓我告訴你我是怎麼想解決這個問題:

int pairs = 0, triples = 0; 
int digit1 = -1, digit2 = -1, digit3 = -1; // no actual digit can be -1 

while (x > 0) { 
    // keep track of the last three digits chopped off 
    digit3 = digit2; 
    digit2 = digit1; 
    digit1 = x % 10; 

    // chop off the last digit of x 
    x /= 10; 

    // check whether we've just chopped off a pair or a triple 
    if (digit1 == digit2) { 
     pairs++; 
     if (digit2 == digit3) { 
      triples++; 
     } 
    } 

    // uncomment these lines for debugging output: 
    // fprintf(stderr, "x = %d, digit(1-3) = %d, %d, %d; %d pairs and %d triples seen\n", 
    //   x, digit1, digit2, digit3, pairs, triples); 
} 

作爲練習,你可能需要運行各種驗證碼值爲x,並且在調試器中循環(建議!)或取消註釋fprintf()調用以查看變量在每次迭代中的變化方式。

一旦你這樣做了,我相信你應該能夠輕鬆地填寫作業的其餘部分。

+2

作爲除很好的答案,只需注意_「x的最後一個10位數字」也被稱爲_「最不重要的數字」_。 – Ziezi

+0

謝謝你的提示。這是我的合作伙伴和我想到的方法,我們似乎無法將其轉換爲代碼。 –

+0

@MichaelWendel:好的,我發佈了一個更明確的解決方案。你現在能看到如何去做剩下的事嗎? –

0

對於它的價值,下面的方法將返回1(真),如果用戶給定的整數具有正好1對相同相鄰數字,0(假)否則:

public int checkSame(int startValue) 
{ 
    int sameAdjacent = 0; 
    int last,pre_last; 
    while(startValue > 0) 
    { 
     last = startValue % 10; 
     pre_last = (startValue/10) % 10; 
     if(last == pre_last) 
      sameAdjacent++; 
     startValue/=10; 
    } 
    return sameAdjacent == 1 ? 1 : 0; 
} 
相關問題