这题如果按常规思路说实话有点折磨人
先循环确定位数,再循环正序输出,还要循环倒序输出
几乎是相同的操作做了三遍
个人认为用字符数组来处理应该最为简便
解题思路
将输入的数字当作字符串来储存,用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 人评分
#include<stdio.h> void main() { int a,b=0,c[5]={}; scanf("%d",&a); int i; for(i=0;i<5;i++) { c[4-i]=a%10; if(a!=0) b=b+1; a=a/10; } printf("%d\n",b); for(i=5-b;i<5;i++) { printf("%d",c[i]); if(i<5) printf(" "); } printf("\n"); for(i=4;i>5-b-1;i--) printf("%d",c[i]); printf("\n"); }
请问题目不是说第二行最后一个数后面没有空格吗,为什么用了第一个方法也能过呀
uq_89689520521 2023-12-26 18:45:16 |
因为输出的是字符数组里面的值,空格并没有在字符数组里面,你懂我意思吧,字符数组里面最后一个数后面虽然也没有值所以他是空串但不是空格串
int main() { int a; int b = 10000, c = 5; scanf("%d", &a); while (a / b == 0) { c--; b = b / 10; } printf("%d\n",c); int d[10]; for (int i = 0; i < c; i++) { d[i] = a / b; printf("%d ",d[i]); a = a % b; b = b / 10; } printf("\n"); for (int i = c - 1; i > -1; i--) { printf("%d", d[i]); } return 0; }
#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; }
#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; }
#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; }
为什么数字位数不超过5,所以定义字符数组长度应不小于6,不应该不超过6吗
CodeRookie 2023-11-20 18:41:21 |
因为C语言定义字符数组来表示字符串,其中字符串的最后一个字符必须是结尾符 ' ',数字位数最大是 5 位,加上一位结尾符,数组长度就不能小于 6 了
有大佬可以帮忙看一下这个吗,结果是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
chacha6 2023-10-23 10:50:05 |
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; }
买不到的数目 (C++代码)浏览:909 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1015 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:1314 |
C语言程序设计教程(第三版)课后习题6.8 (C语言代码)浏览:544 |
The 3n + 1 problem (C语言代码)浏览:603 |
回文数字 (C语言代码)浏览:2539 |
C二级辅导-同因查找 (C语言代码)浏览:618 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:538 |
汽水瓶 (C语言代码)浏览:579 |
众数问题 (C语言代码)浏览:660 |