这题如果按常规思路说实话有点折磨人
先循环确定位数,再循环正序输出,还要循环倒序输出
几乎是相同的操作做了三遍
个人认为用字符数组来处理应该最为简便
解题思路
将输入的数字当作字符串来储存,用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分
372 人评分
用字符串来考虑确实更好 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<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; }
可是题目第二问要求最后一个数字后没有空格呀 这怎么实现
琴海 2022-02-15 17:34:37 |
#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]); }
大佬果然是大佬 我的shit code 源于我的shit mind 我整整写了300多行才实现,但是对于0就没法接解决了,int转char始终是null 还是你的思路好一开始就是字符串,不是用if比较而是for循环代码简洁又简单。 下面是我的shit code #include<stdio.h> #include<string.h> int main(void) { int number,t,j; int a,b,c,d,e; scanf("%d",&number); if(number!=0) { a = (int)(number / 10000); b = (int)(number / 1000)%10 ; c = (int)(number % 1000)/100; d = (int)((number % 100)/10); e = (int)number % 10; if((a!=0)) { printf(评字限制。。。。
Rick 2022-01-25 17:34:19 |
#include<stdio.h> #include<string.h> int main(void) { int number,t,j; int a,b,c,d,e; scanf("%d",&number); if(number!=0) { a = (int)(number / 10000); b = (int)(number / 1000)%10 ; c = (int)(number % 1000)/100; d = (int)((number % 100)/10); e = (int)number % 10; if((a!=0)) { printf("5 "); printf("%d %d %d %d %d",a,b,c,d,e); { if(a<b) {t=b;} else {t=a;a=b;b=t;} if(c>t) {t=c;} else { if(c>a) {j=c;c=t;b=j;} else {j=c;c=t;b=a;a=j;} } int a1 = c; int b1 = d; int c1 = e; if (a1<b1) {t=b1;} else {t=a1;a1=b1; b1=t;} if(c1>t) {t=c1;} else { if(c1>a1) {j=c1;c1=t;b1=j;} else {j=c1; c1=t; b1=a1;a1=j;} } int a2 = a; int b2 = b; int c2 = a1; if (a2<b2) {t=b2;} else {t=a2;a2=b2;b2=t;} if(c2>t) {t=c2;} else { if(c2>a2) { j=c2;c2=t;b2=j;} else {j=c2;c2=t; b2=a2;a2=j; } } int a3 = a; int b3 = b; int c3 = a1; if (a3<b3) { t=b3; } else { t=a3; a3=b3; b3=t; } if(c3>t) { t=c3; } else { if(c3>a3) { j=c3; c3=t; b3=j; } else { j=c3; c3=t; b3=a3; a3=j; } } int a4 = b3; int b4 = c3; int c4 = b1; if (a4<b4) { t=b4; } else { t=a4; a4=b4; b4=t; } if(c4>t) { t=c4; } else { if(c4>a4) { j=c4; c4=t; b4=j; } else { j=c4; c4=t; b4=a4; a4=j; } } int a5 = a3; int b5 = a4; int c5 = b4; if (a5<b5) { t=b5; } else { t=a5; a5=b5; b5=t; } if(c5>t) { t=c5; } else { if(c5>a5) { j=c5; c5=t; b5=j; } else { j=c5; c5=t; b5=a5; a5=j; } } printf(" %d%d%d%d%d ",a5,b5,c5,c4,c1); } } else if((a==0)&(b!=0)) { printf("4 "); printf("%d %d %d %d",b,c,d,e); int a1= b; int b1= c; int c1= d; if (a1<b1) { t=b1; } else { t=a1; a1=b1; b1=t; } if(c1>t) { t=c1; } else { if(c1>a1) { j=c1; c1=t; b1=j; } else { j=c1; c1=t; b1=a1; a1=j; } } int a2 = b1; int b2 = c1; int c2 = e; if (a2<b2) { t=b2; } else { t=a2; a2=b2; b2=t; } if(c2>t) { t=c2; } else { if(c2>a2) { j=c2; c2=t; b2=j; } else { j=c2; c2=t; b2=a2; a2=j; } } int a3 = a1; int b3 = a2; int c3 = b2; if (a3<b3) { t=b3; } else { t=a3; a3=b3; b3=t; } if(c3>t) { t=c3; } else { if(c3>a3) { j=c3; c3=t; b3=j; } else { j=c3; c3=t; b3=a3; a3=j; } } printf(" %d%d%d%d ",a3,b3,c3,c2); } else if((a==0)&(b==0)&(c!=0)) { printf("3 "); printf("%d %d %d",c,d,e); int a1= c; int b1= d; int c1= e; if (a1<b1) { t=b1; } else { t=a1; a1=b1; b1=t; } if(c1>t) { t=c1; } else { if(c1>a1) { j=c1; c1=t; b1=j; } else { j=c1; c1=t; b1=a1; a1=j; } } printf(" %d%d%d",a1,b1,c1); } else if((a==0)&(b==0)&(c==0)&(d!=0)) { printf("2 "); printf("%d %d",d,e); int a1= d; int b1= e; if (a1<b1) { t=b1; } else { t=a1; a1=b1; b1=t; } printf(" %d%d",a1,b1); } else if((a==0)&(b==0)&(c==0)&(d==0)&(e!=0)) { printf("1 "); printf("%d ",e); printf(" %d",e); } } else { printf("1 "); printf("0 "); printf("0"); } return 0; }
liyuu 2022-02-14 15:16:15 |
你能坚持打出来这么多行也挺nb
果然数组简洁多了,作者大大真棒 #include<stdio.h> #include<string.h> //头文件,strlen获取字符串长度包含在内 int main() { char a[6]; //题目限制5位数字,\0也会占一个字节,就定了他的内存空间为6 scanf("%s",&a); int len=strlen(a),i; printf("%d\n",len); for(i=0;i<len;i++) { printf("%c ",a[i]); } printf("\n"); for(i=len-1;i>=0;i--) { printf("%c",a[i]); } return 0; }
#include<stdio.h> int main(){ int x,a[5]; scanf("%d",&x); int digit,cnt,i; int ret = 0,n=1; while ( x>0 ){ digit = x%10; cnt++; while(x>0){ a[n]=digit; n++; break; } // printf("%d",digit); ret = ret*10 + digit; //printf("x=%d,digit=%d,ret=%d\n",x,digit,ret); x/=10; } printf("%d\n",cnt); for(i=cnt;i>0;i--){ printf("%d",a[i]); if(i==1) printf("\n"); else printf(" "); } printf("%d\n",ret); return 0; } 为什么在Dev-c上可以运行,在这上面就Segmentation fault啊,大佬们
#include<stdio.h> int main(){ int a[5],i,numb,t=0; while(1){ scanf("%d",numb); a[i] = numb; t++; if(numb=='\n'){ break; } } printf("%d\n",t); for(int i=0;i<t;i++){ printf("%d ",a[i]); } printf("\n"); for(int i=t;i>=0;i--){ printf("%d",a[t]); } return 0; } 为什么不可以? 求大佬!!!
剔除相关数 (C语言代码)浏览:1058 |
C语言训练-计算t=1+1/2+1/3+...+1/n (C语言代码)浏览:910 |
多输入输出练习1 (C语言代码)浏览:1219 |
C语言训练-列出最简真分数序列* (C语言代码)浏览:658 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:565 |
C二级辅导-同因查找 (C语言代码)浏览:618 |
The 3n + 1 problem (C语言代码)浏览:550 |
C语言程序设计教程(第三版)课后习题12.5 (C语言代码)浏览:799 |
班级人数 (C语言代码)浏览:981 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:593 |
oula 2022-02-27 20:09:34 |
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 2022-02-27 20:10:54 |
另外评论区的答案我扫了一圈,有的只满足输入是完整五位数的情况,输入少于五位数输入完全不符合题目描述的逻辑
oula 2022-02-27 20:12:52 |
想了一下,以字符串去考虑应该是最优解