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

一,题目要求:

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

   


     

      


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值