《华为机试在线训练》之数字颠倒

    xiaoxiao2021-03-25  139

    一,题目要求:

        1,题目描述:输入一个整数,将这个整数以字符串的形式逆序输出,程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001

        2,输入描述:输入一个int整数

        3,将这个整数以字符串的形式逆序输出

        4,输入例子:1516000

        5,输出例子:0006151

    二,题目分析:

          1,第一种情况

           当我拿到这个题目的时候我下意识地想到使用数组来进行算法编写,但是后来考虑了一下,如果使用数组则数组的大小无法界定和分配,而且还很麻烦。在这里可以试验一下,使用数组的时候怎么编写程序:

          

    #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char str[10]; int i, j; char tmp; while (scanf("%s", str) == 1) { // 连续输入字符串给str变量,遇到EOF结束 i = strlen(str); i--; // 求结束符'\0'前一个位置 for (j = 0; j < i; j++, i--) {//字符串反转 tmp = str[i]; str[i] = str[j]; str[j] = tmp; } printf("%s\n", str); } return 0; }

        我们可以看到这个就是使用数组交换位置次序实现的顺序颠倒,我们可以看看图1中的结果,似乎是实现了题目的要求,但是大家看看图2中一旦输入位数变多,则出现数组越界,产生错误的情况。

                                    

                                                                                                      图1 结果图

                                  

                                                                           图2   输入位数过大数组越界的情况

           2,第二种情况,可能有些人想到了通过求余数,将每一位的数都存到数组,再依次打印,但是在输入的过程中没有考虑到如果首位是0的情况下该怎么办呢,看代码

            

    #include<stdio.h> int some(int c) { int i,j; j=0; while(c/10!=0) { i=c; j=j*10+i ; c=c/10; } j=j*10+c; return(j); } int main(void) {int a; scanf("%d",&a); printf("%d\n",some(a)); return 0; }

              如图3结果大家可以看到

                                           

                                                                                      图3   运行正确结果图

                                           

                                                                                  图4  没有考虑到输入有0的情况

          从图4和图5中可以看到问题所在了,对于这个题目考虑的还是不够完全。同样下面这个方法也是跟这个类似也会出现同样的问题。

           

    #include<stdio.h> int main() { int num, temp = 0; scanf("%d", &num); while(num){ temp = temp * 10 + num % 10; num /= 10; } printf("%d", temp); return 0; }

    3, 本人的解法

            在我最开始看到题目的时候我也想过用数组,但是前面都讨论了这些情况,所以我第一时间想到了使用递归来进行解答。关于递归的一些知识可以参考我的博文:点击打开链接  http://blog.csdn.net/huangchijun11/article/details/61199115  大家可以看一看递归的一些知识和解答。在这里就不详细介绍,把代码贴出来,大家看一看吧,代码很简单。

         

    #include <stdio.h> void print() { char a; scanf("%c",&a); if(a >='0'&&a <='9') print(); if(a >='0'&&a <='9') printf("%c", a); } int main() { print(); return 0; }

          运行结果如图5、6、7所示:

                                        

                                                                                                           图 5  结果1,正确输出

                                       

                                                                                       图6  结果2,有0的情况也正确输出图

                                       

                                                                                                   图7   结果3 大位数数据的也正确输出

             

          

    
    转载请注明原文地址: https://ju.6miu.com/read-24656.html

    最新回复(0)