这题如果按常规思路说实话有点折磨人
先循环确定位数,再循环正序输出,还要循环倒序输出
几乎是相同的操作做了三遍
个人认为用字符数组来处理应该最为简便
解题思路
将输入的数字当作字符串来储存,用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> int main() { int i,j=0; scanf("%d",&i); for(i=0;i<5;i++) { j++; } printf("%d\n",j); for(i=1;i<=5;i++) { printf("%d ",i); } printf("\n"); for(i=5;i>=1;i--) { printf("%d",i); } return 0; }
CodeRookie 2021-07-20 08:45:29 |
兄弟,再读读题吧,这题只是测试用例太简单了…
C 2021-07-20 14:29:56 |
写的好麻烦啊
C 2021-07-20 14:30:41 |
@Shmily124 不过黑猫白猫抓到老鼠就是好猫,用不同方法也很不错
远方的星 2021-07-31 23:40:56 |
你题目理解错啦,大兄弟
邹宇强 2021-09-29 23:12:12 |
确实是题目理解错了
七六大順 2021-10-05 14:18:26 |
有点离谱,看清题目吧
秋清深 2021-10-08 16:44:35 |
你这玩意和printf("5 1 2 3 4 5 54321")有啥区别?
小c 2021-10-10 09:28:37 |
@807 同感
FangyangEU 2021-11-03 10:02:44 |
你这个就只能用个五位数,试试五位数以下
你好,请问你这种题解是怎么写的呀,尤其是贴出来的代码部分,小白一枚不知道怎么弄那个格式,真心求教
CodeRookie 2021-06-23 12:19:50 |
不好意思这么久才看到,是在编辑栏那里,有一个 [编辑语言] 按钮,选择自己的语言(比如C/C++)之后,就会出现代码编辑框,把代码粘贴进去即可
C 2021-07-18 14:37:05 |
#include<stdio.h> int main() { int i,j=0; scanf("%d",&i); for(i=0;i<5;i++) { j++; } printf("%d ",j); for(i=1;i<=5;i++) { printf("%d ",i); } printf(" "); for(i=5;i>=1;i--) { printf("%d",i); } return 0; }
C 2021-07-18 14:38:08 |
来看看我的思路,超简单,这才应该是我们新手的作业解法吧,不要盲目看题解啊,自己思考,脑袋越来越聪明,看题解不是闲着吗,未免有点浪费时间
#include<stdio.h> #include<string.h> int main(void) { char str[10]; scanf("%s",str); int len=strlen(str); printf("%d\n",len); int i; for( i=0;i<len;i++) { printf("%c",str[i]); } printf("\n"); for( i=len-1;i>=0;i--) { printf("%c",str[i]); } return 0; }
# include <stdio.h> int main(void) { int arr[20]; int len = 5; /* printf("请输入长度!"); scanf("%d", &len); */// 5 for (int i = 0; i < len -1; i++) scanf("开始输点数吧!%d", &arr[i]); int s = 0; while (arr[s] && arr[s]) s++; printf("共有 %d 位数!", s); for (i = 0; i < len -1; i++) printf("改变前的数 : %d", arr[i]); int k = sizeof(arr) / sizeof(arr[0]) - len - 1; for (int j = 0; j < k; j++,k--) { int temp = arr[j]; arr[j] = arr[k]; arr[k] = temp; } for (i = 0; i < len -1; i++) printf("改变后的数!", arr[i]); printf("\n"); return 0; } 二改了,还不行。。。
# include <stdio.h> int main(void) { int arr[10]; int len; scanf("长度 = %d\n", &len); int s = 0; for (int i = 0; i < len; i++) scanf("开始输点数吧!%d\n", &arr[i]); if (arr[s] && arr[s]) s++; printf("共有 %d 位数!\n", s); printf("改变前的数 : %d\n", arr); int k = sizeof(arr) / sizeof(arr[0]) - len; for (int j = 0; j < k; j++,k--) { int temp = arr[j]; arr[j] = arr[k]; arr[k] = temp; } printf("改变后的数!\n", arr); return 0; } 我这个为什么错的
真的没必要这么繁琐,int数组,三层for,第一层for用来输出数组,然后if判断每个数字元素是否为'0',然后总结不为0的位数,这样完成第一步了,第二个和第三个for进行嵌套, 内层的输出每个数的交换,外层的输出每交换一次就--,之后在循环外使用printf进行输出位数、原数、更改数即可,思路是这样代码就不上了,祝大家成功!!
那个第二行最后一个数字不能带空格的说
十幺 2021-06-24 21:52:19 |
我带空格提交 它也不判我错 这作者好像也没注意到这点
CodeRookie 2021-07-20 08:48:39 |
@shiyao 是的,这题判定不严格,测试用例也只有一个
夜微凉 2021-07-20 15:34:40 |
for (int i = 0; i < len-1; i++) //从左往右遍历输出,由于最后一个后面不能有空格,最后一个单独输出 { printf("%c ", str[i]); } printf("%c", str[len-1]);
兰顿蚂蚁 (C++代码)浏览:1160 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:568 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:562 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:1314 |
C语言训练-求1+2!+3!+...+N!的和 (C语言代码)浏览:822 |
字符逆序 (C语言代码)浏览:645 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:561 |
剪刀石头布 (C++代码)浏览:1811 |
简单的a+b (C语言代码)浏览:491 |
班级人数 (C语言代码)浏览:981 |