这题如果按常规思路说实话有点折磨人

先循环确定位数,再循环正序输出,还要循环倒序输出

几乎是相同的操作做了三遍

个人认为用字符数组来处理应该最为简便


解题思路

将输入的数字当作字符串来储存,用strlen(  ) 函数得到字符串长度,即为数字位数

将字符串从左到右遍历输出(带空格)

最后还有一个回车不要忘了

再将字符串从右往左遍历输出(不带空格)就好了


注意事项:

题目说数字位数不超过5,所以定义字符数组长度应不小于6

因为字符串结尾还有结尾符 '\0' 占一位

参考代码:

#include <stdio.h>
#include <string.h>         //C语言字符串头文件,strlen() 函数包含在此内
  
int main()
{
    char str[10];                       //定义字符串长度为 10
    scanf("%s", str);                   //输入数字 (作为字符串输入)
      
    int len = strlen(str);              //获取字符串长度
    printf("%d\n", len);                //输出字符串长度,即为数字位数
    for (int i = 0; i < len; i++)       //从左往右遍历输出
    {
        printf("%c ", str[i]);
    }
    printf("\n");                       //输出回车
    for (int i = len - 1; i >= 0; i--)  //从右往左遍历输出
    {
        printf("%c", str[i]);
    }
    return 0;
}


下面是常规思路:


前面我们说过要进行三个循环,第一个循环要确定数字的位数

那么可以用一个 while 循环,将这个数字不断地除以 10 

每除一次,位数加 1 ,知道数字变为 0 为止


第二个循环,就要用到 pow 计算幂函数了

对于一个数字

要得到它的个位数,就用它除以 10 的 0 次方 再对 10 取余

要得到它的十位数,就用它除以 10 的 1 次方 再对 10 取余

要得到它的百位数,就用它除以 10 的 2 次方 再对 10 取余

……

要得到它的第 i 位 (从右往左),就用它除以 10 的 i - 1 次方 再对 10 取余即可

那么我们可以对这里 10 的指数循环,从 n - 1 循环到 0 

然后计算并输出数字即可,如下:

for (int i = n - 1; i >= 0; i--) {
    temp = num / pow(10, i);        //除以 10 的 i 次方
    printf("%d ", temp % 10);       //输出对 10 取余
}


第三个循环就简单多了,把第二个循环倒过来,从 0 循环到 n - 1 即可


参考代码:

#include <stdio.h>
#include <math.h>       //C语言数学头文件,pow() 函数包含在此内
  
int main() {
    int num;                            //定义数字
    scanf("%d", &num);                  //输入数字
    int n = 0;                          //定义数字的位数
    if (num == 0) n = 1;                //如果数字是0,则位数为1
    int temp = num;                     //定义 temp 来代替 num 进行计算
    while (temp) {                      //将temp循环除以 10,到 0 为止
        n++;        
        temp /= 10;     
    }       
    printf("%d\n", n);                  //输出数字位数
    for (int i = n - 1; i >= 0; i--) {  //第二循环,从左往右输出
        temp = num / pow(10, i);        //除以 10 的 i 次方
        printf("%d ", temp % 10);       //输出对 10 取余
    }
    printf("\n");                       //输出回车
    for (int i = 0; i < n; i++) {       //第三循环,从右往左循环
        temp = num / pow(10, i);        //除以 10 的 i 次方
        printf("%d", temp % 10);        //输出对 10 取余
    }
    return 0;
}


题目中说第二行输出最后没有空格,之前没有注意到,但是因为判定没有那么严格也通过了

那要处理结尾空格的话,可以把数字和空格分开输出,加一个 if 语句判定是否到了结尾,要不要输出空格

如下:

    //字符串方法
    for (int i = 0; i < len; i++)       //从左往右遍历输出
    {
        printf("%c", str[i]);
        if (i != len - 1)    printf(" ");    // i == len - 1 时即为最后一个数字,不输出空格
    }


    //常规方法
    for (int i = n - 1; i >= 0; i--) {  //第二循环,从左往右输出
        temp = num / pow(10, i);        //除以 10 的 i 次方
        printf("%d", temp % 10);        //输出对 10 取余
        if (i != 0)    printf(" ");     // i == 0 时即为最后一个数字,不输出空格
    }


点赞(3)
 

0.0分

304 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 156 条评论

荒塘蛙 2年前 回复TA
常规做法的话两次循环就可以,正排序和逆排序数的获得可以在一个循环里:参见
#include<stdio.h>
int main(void)
{
    int a,wei[5],i,co=1,re=0,t=1;
    scanf("%d",&a);
    wei[0]=a%10;
    for(i=1;i<5;i++)
    {
	a/=10;
    wei[i]=a%10;
	if(a!=0)
	co+=1;
	}
	printf("%d\n",i);
	for(i=co-1;i>=0;i--)
	{
	if(i>0)
	{
	printf("%d ",wei[i]);
	}
	re+=wei[i]*t;
	t*=10;
	}
	printf("%d\n",wei[0]);
	printf("%d",re);
    return 0;
}
oula 2年前 回复TA
@oula 想了一下,以字符串去考虑应该是最优解
oula 2年前 回复TA
@oula 另外评论区的答案我扫了一圈,有的只满足输入是完整五位数的情况,输入少于五位数输入完全不符合题目描述的逻辑
oula 2年前 回复TA
@oula printf("%d
" ,wei);         for(int i = 0;i < 5;i++)         {             if(arr[i] != 0)             {                 printf("%d ",arr[i]);                 if(i == 4)                 {                     printf("
");                 }             }             else             {                 beijian++;             }         }         for(int i = 4; i >= beijian; i--)         {             printf("%d" ,arr[i]);         }         printf("
");     }     else     {         printf("超出五位数
");     }
oula 2年前 回复TA
用字符串来考虑确实更好
void Print_Data(int data)
{
    int arr[5] = {0 , 0, 0, 0, 0};
    int wei = 0;
    int data_Output = 0;
    int beijian  = 0;//记录有几个数为0
    //判断是五位数
    if((data / 100000) == 0)
    {
        //记录10000
        arr[0] = data / 10000;
        //记录1000
        arr[1] = (data % 10000) / 1000;
        //记录100
        arr[2] = (data % 1000) / 100;
        //记录10
        arr[3] = (data % 100) / 10;
        //记录1
        arr[4] = data % 10;

        for(int i = 0;i < 5; i++)
        {
            if(arr[i] != 0)
            {
                wei++;
            }
        }
琴海 2年前 回复TA
@为人民服务 #include <stdio.h> #include <string.h> void main() { 	char s[6]; 	gets(s); 	int str=strlen(s),i; 	printf("%d
",str); 	for(i=0;i<str;i++) 		if(i!=str-1)printf("%c ",s[i]); 		else printf("%c",s[i]); 	printf("
"); 	for(i=str-1;i>=0;i--) 		printf("%c",s[i]); }
liyuu 2年前 回复TA
@Rick 你能坚持打出来这么多行也挺nb
FoolHungry 3年前 回复TA
#include<stdio.h>//搬砖代码来辣,拿走不谢
#include<math.h>
int main()
{
    int a[5],i,n,k,m,t,h;
    scanf("%d",&n);
    if(n==0)
    {
        k=1;
    }
    else
    {
        for(i=0;n/pow(10,i)>=1;i++)
     {
        k=i+1;
     }
    }
    for(m=0;m<=k-1;m++)
    {
        a[m]=(int)(n/pow(10,m))%10;
    }
    printf("%d\n",k);
    for(t=k-1;t>=0;t--)
    {
        if(t==0)  printf("%d\n",a[t]);
        else        printf("%d ",a[t]);
    }
    for(h=0;h<=k-1;h++)
    {
        printf("%d",a[h]);
    }
    return 0;

}
为人民服务 3年前 回复TA
可是题目第二问要求最后一个数字后没有空格呀  这怎么实现
可可萝世界第一可爱 3年前 回复TA
膜拜大佬!!!