《华为机试在线训练》之数字颠倒
2017-03-10 21:39
239 查看
一,题目要求:
1,题目描述:输入一个整数,将这个整数以字符串的形式逆序输出,程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
2,输入描述:输入一个int整数
3,将这个整数以字符串的形式逆序输出
4,输入例子:1516000
5,输出例子:0006151
二,题目分析:
1,第一种情况
当我拿到这个题目的时候我下意识地想到使用数组来进行算法编写,但是后来考虑了一下,如果使用数组则数组的大小无法界定和分配,而且还很麻烦。在这里可以试验一下,使用数组的时候怎么编写程序:
我们可以看到这个就是使用数组交换位置次序实现的顺序颠倒,我们可以看看图1中的结果,似乎是实现了题目的要求,但是大家看看图2中一旦输入位数变多,则出现数组越界,产生错误的情况。
![](http://img.blog.csdn.net/20170310211706989?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhbmdjaGlqdW4xMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1 结果图
![](http://img.blog.csdn.net/20170310212006908?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhbmdjaGlqdW4xMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图2 输入位数过大数组越界的情况
2,第二种情况,可能有些人想到了通过求余数,将每一位的数都存到数组,再依次打印,但是在输入的过程中没有考虑到如果首位是0的情况下该怎么办呢,看代码
如图3结果大家可以看到
![](http://img.blog.csdn.net/20170310212604275?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhbmdjaGlqdW4xMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图3 运行正确结果图
![](http://img.blog.csdn.net/20170310212609869?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhbmdjaGlqdW4xMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图4 没有考虑到输入有0的情况
从图4和图5中可以看到问题所在了,对于这个题目考虑的还是不够完全。同样下面这个方法也是跟这个类似也会出现同样的问题。
3, 本人的解法
在我最开始看到题目的时候我也想过用数组,但是前面都讨论了这些情况,所以我第一时间想到了使用递归来进行解答。关于递归的一些知识可以参考我的博文:点击打开链接
http://blog.csdn.net/huangchijun11/article/details/61199115 大家可以看一看递归的一些知识和解答。在这里就不详细介绍,把代码贴出来,大家看一看吧,代码很简单。
运行结果如图5、6、7所示:
![](http://img.blog.csdn.net/20170310213521709?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhbmdjaGlqdW4xMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图 5 结果1,正确输出
![](http://img.blog.csdn.net/20170310213528225?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhbmdjaGlqdW4xMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图6 结果2,有0的情况也正确输出图
![](http://img.blog.csdn.net/20170310213534506?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhbmdjaGlqdW4xMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图7 结果3 大位数数据的也正确输出
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 大位数数据的也正确输出
相关文章推荐
- 牛客网-华为机试在线训练-3.数字颠倒
- 华为机试在线训练-牛客网(38)在字符串中找出连续最长的数字串
- Java - 华为机试训练 - 数字颠倒
- 牛客网三道编程题(五) 之华为机试在线训练(四)进制转换、删除重复出现的数字、句子逆序
- 牛客网三道编程题(四)华为机试在线训练(三)将数字逆序输出、将n个字符串按照字典顺序排序
- 华为OJ训练之0004-161228-数字颠倒
- 华为机试在线训练-牛客网(23)判断两个IP是否属于同一子网
- 牛客网_华为机试_011_数字颠倒
- 华为机试在线训练-牛客网(36)火车进站
- 牛客网--华为机试在线训练10:字符个数统计
- 《华为机试在线训练》之求int型正整数在内存中存储时1的个数
- 华为机试在线训练-牛客网(6)提取不重复的整数
- 华为机试在线训练-牛客网(9)求int整数在内存中1的个数
- 华为机试在线训练-牛客网(19)【中级】单词倒排
- 【华为机试】数字颠倒
- 华为机试在线训练-牛客网(34)参数解析
- 牛客网--华为机试在线训练1:字符串最后一个单词的长度
- 华为机试在线训练-牛客网(3)字符串最后一个单词的长度
- 《华为机试在线训练》之简单错误记录
- 牛客网三道编程题(三 之华为机试在线训练(二)字符串反转、统计不同字符个数、删除字符串中出现最少的字符