这题如果按常规思路说实话有点折磨人
先循环确定位数,再循环正序输出,还要循环倒序输出
几乎是相同的操作做了三遍
个人认为用字符数组来处理应该最为简便
解题思路
将输入的数字当作字符串来储存,用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 时即为最后一个数字,不输出空格
}0.0分
304 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
常规做法的话两次循环就可以,正排序和逆排序数的获得可以在一个循环里:参见 #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 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("超出五位数 "); }用字符串来考虑确实更好 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++; } }@为人民服务 #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]); }#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; }