C語言程序設計100例之(6):數字反轉

例6    數字反轉

題目描述php

給定一個整數,請將該數各個位上數字反轉獲得一個新數。新數也應知足整數的常見形式,即除非給定的原數爲零,不然反轉後獲得的新數的最高位數字不該爲零(參見樣例2)。算法

輸入格式編程

一個整數 N函數

輸出格式spa

一個整數,表示反轉後的新數。遊戲

輸入樣例 #1 ip

123數學

輸出樣例 #1 io

321循環

輸入樣例 #2

-380

輸出樣例 #2

-83

        (1)編程思路。

        將一個非負整數number各位上的數字依次分離出來,其操做步驟爲:

1)分離出number的個位數,即number%10。

2)將number除以10,做爲新的number,即新的number丟掉了個位數。

3)若是number等於0,分離完畢,結束。不然,轉第1)步,繼續顯示。

例如,number=1234,number%10=4, number=1234/10=123,獲得數字4;

                        number%10=3, number=123/10=12,獲得數字3;

number%10=2, number=12/10=1,獲得數字2;

number%10=1, number=1/10=0,獲得數字1;結束。

由數字四、三、二、1如何獲得整數4321呢?

4321=4*1000+3*100+2*10+1=4*103+3*102+2*10+1

右邊的多項式能夠採用秦九韶算法求解。

設要求解  P=4*103+3*102+2*10+1

可演變爲  P=(((0*10+4)*10 +3)*10+2)*10+1。

這樣,可令P初值爲0,每給定一個數字a,執行 P=P*10+a 便可。

由數字四、三、二、1獲得整數4321的過程描述爲:

P=0  ,給出數字4,P= 0*10+4 =4;   以後數字3 , P=4*10+3= 43;

以後數字2,P= 43*10+2 =432;   最後數字1 , P=432*10+1= 4321。

將上述兩個操做結合起來,一邊分離出number的各位上的數字,一邊將其拼到逆序數P上去,這樣可將求number逆序數P的過程寫成一個簡單的循環。

P=0;

While (number!=0)  { p=p*10+number%10;   number=number/10;   }

(2)源程序。

#include <stdio.h>

int main()

{

         int n,m,f;

         scanf("%d",&n);

         m=0; f=1;

          if (n<0)

         {

                   n=-n;

                   f=-1;

         }

         while (n!=0)

         {

                   m=m*10+n%10;

                   n/=10;

         }

         m=f*m;

         printf("%d\n",m);

         return 0;

}

習題6

6-1  迴文數的個數

題目描述

 「迴文」是指正讀反讀都能讀通的句子,它是古今中外都有的一種修辭方式和文字遊戲,如「我爲人人,人人爲我」等。在數學中也有這樣一類數字有這樣的特徵,稱爲迴文數(palindrome number)。

設n是一任意天然數。若將n的各位數字反向排列所得天然數n1與n相等,則稱n爲一回文數。例如,若n=1234321,則稱n爲一回文數;但若n=1234567,則n不是迴文數。

例如,10到100之間的迴文數有11,22,33,44,55,66,77,88,99共9個。

輸入格式

兩個整數a和b(10≤a≤b≤65535)。

輸出格式

一個整數,表示整數a和b之間全部迴文數的個數。

輸入樣例

10  100

輸出樣例

9

        (1)編程思路。

        一個正整數若是其逆序數與其相等,則它必定是一個迴文數。按例6的方法編寫一個函數int inverse(int n)求整數n的逆序數。

        (2)源程序。

#include<stdio.h>

int inverse(int n)

{

    int s=0;

    while (n!=0)

    {

        s=s*10+n%10;

        n/=10;

    }

    return s;

}

int main()

{

         int a,b,cnt,i;

         while(scanf("%d%d", &a,&b)!=EOF)

         {

                   cnt=0;

                   for (i=a;i<=b;i++)

                          if (i==inverse(i)) cnt++;

                   printf("%d\n", cnt);

         }

         return 0;

}

6-2  迴文數猜測

        本題選自杭州電子科技大學OJ題庫 (http://acm.hdu.edu.cn/showproblem.php?pid=1282)

Problem Description

一個正整數,若是從左向右讀(稱之爲正序數)和從右向左讀(稱之爲倒序數)是同樣的,這樣的數就叫回文數。任取一個正整數,若是不是迴文數,將該數與他的倒序數相加,若其和不是迴文數,則重複上述步驟,一直到得到迴文數爲止。例如:68變成154(68+86),再變成605(154+451),最後變成1111(605+506),而1111是迴文數。因而有數學家提出一個猜測:不論開始是什麼正整數,在通過有限次正序數和倒序數相加的步驟後,都會獲得一個迴文數。至今爲止還不知道這個猜測是對仍是錯。如今請你編程序驗證之。

Input

每行一個正整數。

特別說明:輸入的數據保證中間結果小於2^31。

Output

對應每一個輸入,輸出兩行,一行是變換的次數,一行是變換的過程。

Sample Input

27228

37649

Sample Output

3

27228--->109500--->115401--->219912

2

37649--->132322--->355553

         (1)編程思路。

         一樣編寫一個函數int inverse(int n)求整數n的逆序數。

        (2)源程序。

#include<stdio.h>

int inverse(int n)

{

    int s=0;

    while (n!=0)

    {

        s=s*10+n%10;

        n/=10;

    }

    return s;

}

int main()

{

    int m,cnt,t;

    while(scanf("%d",&m)!=EOF)

    {

        cnt=0;

        t=m;

        while (t!=inverse(t))

        {

            cnt++;

            t=t+inverse(t);

        }

        printf("%d\n",cnt);

        printf("%d",m);

        while (cnt--)

        {

            m=m+inverse(m);

            printf("--->%d",m);

        }

        printf("\n");

    }

    return 0;

}

6-3  叛逆的小明

         本題選自杭州電子科技大學OJ題庫 (http://acm.hdu.edu.cn/showproblem.php?pid=4554)

Problem Description

叛逆期的小明什麼都喜歡反着作,連看數字也是如此(負號除外),好比:小明會把1234它當作4321;把-1234當作-4321;把230當作032 (032=32);把-230當作-032(-032=-32)。

如今,小明作了一些a+b和a-b的題目(a, b爲整數且不含前導0),若是給你這些題目正確的答案,你能猜出小明會作獲得什麼答案嗎?

Input

輸入第一行爲一個正整數T(T<=10000),表示小明共作了T道題。

接下來T行,每行是兩個整數x,y(-1000000<=x, y<=1000000), x表示a+b的正確答案,y表示a-b的正確答案。

輸入保證合法,且不需考慮a或b是小數的狀況。

Output

輸出共T行,每行輸出兩個整數s t,之間用一個空格分開,其中s表示小明將獲得的a+b答案,t表示小明將獲得的a-b答案。

Sample Input

3

20 6

7 7

-100 -140

Sample Output

38 24

7 7

-19 -23

        (1)編程思路。

         因爲輸入的x和y是正確答案,即x=a+b ,y=a-b。 可求得 a=(x+y)/2,b=(x-y)/2。

        分別求得a和b的逆序數c和d,這是小明的運算數,輸出c+d和c-d便可。

       (2)源程序。

#include<stdio.h>

int inverse(int n)

{

    int s=0;

    while (n!=0)

    {

        s=s*10+n%10;

        n/=10;

    }

    return s;

}

int main()

{

         int x,y,a,b,c,d,t;

         scanf("%d", &t);

         while(t--)

         {

                   scanf("%d %d", &x, &y);

                   a = (x +y) / 2;

                   b = (x - y) / 2;

                   if (a < 0)

                            c = -1*inverse(-a);

                   else

                            c = inverse(a);

                   if (b < 0)

                            d = -1*inverse(-b);

                   else

                            d = inverse(b);

                   printf("%d %d\n", c + d, c - d);

         }

         return 0;

}

相關文章
相關標籤/搜索