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

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

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

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


解题思路

将输入的数字当作字符串来储存,用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 条评论

CodeRookie 1年前 回复TA
@请早睡吧 因为C语言定义字符数组来表示字符串,其中字符串的最后一个字符必须是结尾符 &#039;&#039;,数字位数最大是 5 位,加上一位结尾符,数组长度就不能小于 6 了
阿文 1年前 回复TA
#include <stdio.h>
#include<string.h>

int main() {
     int a;
     char aw[101];
     char *p;
     scanf("%s",aw);
     p=aw;
     int c=strlen(aw);
     printf("%d\n",c);
     for(int i=0;i<c;i++){
     	
     	printf("%c ",*(p+i));
	 }
	 printf("\n");
	 for(int j=c-1;j>=0;j--){
	 	
	 	
	 	printf("%c",*(p+j));
 }
  
  
    return 0;
}
uq_87656677577 1年前 回复TA
#include<stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	int a[5];
	int i,m;
	m=10000;
	
	for(i=1;i<=5;i++){
		a[i] = n / m;
		if(i==5)
		break;
		n = n - a[i] * m;
		m = m / 10;
	}
	m=6;
	for(i=1;i<=5;i++){
		m=m-1;
		if(a[i]==0){
			continue;
		}
		printf("%d\n",m);
		break;
	}
	for(i=6-m;i<=5;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	int j = 1;
	int x=0,y=0;
	for(i=6-m;i<=5;i++){
		x = j * a[i];
		y = y + x;
		j = j * 10;
	}
	printf("%d",y);
	
    
return 0;
}
阿文 1年前 回复TA
#include<stdio.h>



void  aw(int n)

   {

    if(n>9)

   {

    aw(n/10);

   }

    printf("%d ",n%10);

   

   

   }//第2步递归

   int main()

{

  int c=0,b;

  int d=0;

  scanf("%d",&c);// 输入一个数

  b=c;  //将c赋值给b是为了保留c的值,因为后面循环用了c,c的值会变

  while(c!=0){

 

  c=c/10;

  d++;

  

  }        //求得位数

  printf("%d\n",d);

  aw(b);      //输出正序值

  printf("\n"); 

  for(int e=0;e<d;e++){

 

  int g=b/pow(10,e);

  printf("%d",g%10);

  }         //输出逆序值

  

    return 0;

}
阿文 1年前 回复TA
@菜鸟程序员 a=m?我问你怎么跳出while循环,你都没有限制n
觅凡霜 1年前 回复TA
@dotcpp0687848 兄弟,for语句括号后面不用;eg:     for(  ;   ;  )在这后面不用加;了
请早睡吧 1年前 回复TA
为什么数字位数不超过5,所以定义字符数组长度应不小于6,不应该不超过6吗
chacha6 1年前 回复TA
@chacha6 for (i = count; i > 0; i--)     {         for (t = 1; t < i; t++)         {             mul = mul * 10;         }         int h = j;         j = j / mul;         if (j != 0)             printf("%d ", j);         else             printf("%d", h);         j = h - j * mul;         mul = 1;     }     printf("
");//到这里     int g = n;     for (i = 0; i < count; i++)     {         int h = g % 10;         if (h != 0)             printf("%d", h);         else             printf("%d", g);         g = g / 10;       }     return 0; }
chacha6 1年前 回复TA
有大佬可以帮忙看一下这个吗,结果是80分
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n = 0, count = 0,i=0,t=0,ret=0,mul=1;
	scanf_s("%d", &n);
	int k = n;
	if (k == 0)
	{
		count = 1;
		printf("%d\n", count);
	}
	while (k != 0)
	{
		count++;
		k = k / 10;
		ret = 1;
	}
	if (ret == 1)
	{
		if (count > 5)
			return 0;;
		printf("%d\n", count);
	}
	int j = n;//从这里
	for (i = count; i > 0; i--)
	{
		for (t = 1; t < i; t++)
		{
			mul = mul * 10;
		}
		int h = j;
		j = j / mul;
		if (j != 0)
			printf("%d ", j);
		else
			printf("%d", h);
		j = h - j * mul;
		mul = 1;
	}
	printf("\n");//到这里
	int g = n;
	for
会说C语言的萝卜 1年前 回复TA
题解写的真好 :-)