您的位置:首页 > 理论基础 > 数据结构算法

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

2017-03-10 21:39 239 查看
一,题目要求:

    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%10;
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 大位数数据的也正确输出

   

     

      


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息