zoukankan      html  css  js  c++  java
  • C语言程序设计100例之(6):数字反转

    例6    数字反转

    题目描述

    给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。

    输入格式

    一个整数 N

    输出格式

    一个整数,表示反转后的新数。

    输入样例 #1

    123

    输出样例 #1

    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;结束。

    由数字4、3、2、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 即可。

    由数字4、3、2、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 ",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 ", 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 ",cnt);

            printf("%d",m);

            while (cnt--)

            {

                m=m+inverse(m);

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

            }

            printf(" ");

        }

        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 ", c + d, c - d);

             }

             return 0;

    }

  • 相关阅读:
    TPYBoard读取芯片上的温度传感器
    Micropython实例之TPYBoard来电显示功能演示
    Micropython教程之TPYBoardv102 DIY蓝牙智能小车实例
    TurnipBit—MicroPython开发板:妥妥拽拽零基础也能玩编程
    可视化编程开发板TurnipBit支持LED亮度可调功能
    TPYBoard实例之利用WHID为隔离主机建立隐秘通道
    带以太网的MicroPython开发板:TPYBoardv201建立云加法器实例
    带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例
    数学运算类(三角函数,取整函数,指数函数,取最大值,最小值,绝对值)
    数字格式化和数字分组
  • 原文地址:https://www.cnblogs.com/cs-whut/p/11863842.html
Copyright © 2011-2022 走看看