C 练习实例29
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
程序分析:学会分解出每一位数,如下解释。
实例
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include <stdio.h>
int main( )
{
long a,b,c,d,e,x;
printf("请输入 5 位数字:");
scanf("%ld",&x);
a=x/10000; /*分解出万位*/
b=x%10000/1000; /*分解出千位*/
c=x%1000/100; /*分解出百位*/
d=x%100/10; /*分解出十位*/
e=x%10; /*分解出个位*/
if (a!=0){
printf("为 5 位数,逆序为: %ld %ld %ld %ld %ld\n",e,d,c,b,a);
} else if(b!=0) {
printf("为 4 位数,逆序为: %ld %ld %ld %ld\n",e,d,c,b);
} else if(c!=0) {
printf("为 3 位数,逆序为:%ld %ld %ld\n",e,d,c);
} else if(d!=0) {
printf("为 2 位数,逆序为: %ld %ld\n",e,d);
} else if(e!=0) {
printf("为 1 位数,逆序为:%ld\n",e);
}
}
以上实例输出结果为:
请输入 5 位数字:12345 为 5 位数,逆序为: 5 4 3 2 1
C 语言经典100例
叮咚
126***9648@qq.com
其他解法:
#include <stdio.h> int main() { int n; printf("请输入大于 10 的数字:"); scanf("%d",&n); int x[1000]; int i=0; int j=0; while(n!=0) { x[i]=n%10; n=n/10; i++; } int z=i; printf("该数字为 %d 位数",z); printf("\n逆序为:"); for(j=0;j<z;j++) { printf("%d ",x[j]); } }以上实例输出结果为:
叮咚
126***9648@qq.com
火云
103***8583@qq.com
参考解法:
#include <stdio.h> #include<string.h> void Reverse_Output( int n); static char str[5]; int main() { printf("请输入你的整数:"); scanf("%s",str); printf("这是一个 %lu 位数。\n",strlen (str)); printf("逆序为:"); Reverse_Output(strlen (str)); return 0; } void Reverse_Output(int n) { while(n>0) { printf("%c ",str[--n]); } }火云
103***8583@qq.com
半弧寻
ban***un@163.com
参考解法
#include <stdio.h> int main() { int i,j,k,count=0; printf("请输入一个不多于5位的正整数:"); scanf("%d",&i); printf("逆序为:"); for(j=1;j<=5;j++) { k=i%10; i=i/10; count++; printf("%d ",k); if(i==0) { break; } } printf("\n为 %d 位数\n",count); return 0; }半弧寻
ban***un@163.com
程 征
228***950@qq.com
参考实例:
#include <stdio.h> int main( ) { int x; int y = 0; printf("请输入一个正整数:\n"); scanf("%d", &x); printf("逆序为:\n"); for (int i = x; i > 0; i /= 10) { printf("%d ", i % 10); y++; } printf("\n为 %d 位数 \n", y); }程 征
228***950@qq.com
HIT_CCC
117***2963@qq.com
参考方法:
#include<stdio.h> int main(void) { int n,count = 0,num; printf("请输入一个不多于5位的正整数:"); scanf("%d",&n); num = n; while(n) { n = n/10; count++; } printf("为%d位数,逆序为:",count); while(num) { printf("%-3d",num%10); num = num/10; } return 0; }HIT_CCC
117***2963@qq.com
socbis
975***651@qq.com
参考方法:
#include<stdio.h> #include<string.h> int reverse(int num, char* buf) { int head = 0, tail = num - 1; int counter = num / 2; if(counter == 0) return 0; *(buf + head) ^= *(buf + tail); *(buf + tail) ^= *(buf + head); *(buf + head) ^= *(buf + tail); return reverse(num - 2, buf + 1); } int main() { char buf[6] = {0}; int length = 5; printf("请输入 5 位数字:"); fgets(buf, 6, stdin); if(buf[4] != '\n' && strlen(buf) == 5) { scanf("%*[^\n]"); scanf("%*c"); } else if(buf[4] == '\n' && strlen(buf) == 5) length = 4; else length = strlen(buf) - 1; reverse(strlen(buf), buf); printf("这个%d位数倒序输出为:%s\n",length, buf); return 0; }socbis
975***651@qq.com
ronnyz
221***8677@qq.com
参考方法:
#include <stdio.h> int main(){ int k,n,count=0; printf("请输入一个正整数:\n"); scanf("%d",&n); while(n){ k=n%10; printf("%d ",k); count++; n/=10; } printf("\n%d",count); return 0; }ronnyz
221***8677@qq.com
kisushotto
kis***otto@163.com
利用递归:
#include <stdio.h> int digits(int k); void reverseprintNum(int g); int main() { int num; printf("输入一个数:"); scanf("%d", &num); printf("位数:%d\n", digits(num)); printf("逆序输出:"); reverseprintNum(num); return 0; } int digits(int k) { if (k / 10 == 0) return 1; else return digits(k / 10) + 1; } void reverseprintNum(int g) { if (g / 10 == 0) printf("%d", g); else { printf("%d", g % 10); // 最后一个数字作为第一个数字输出 reverseprintNum(g / 10); // 删除最后一个数字 } }kisushotto
kis***otto@163.com
木子李
Li1***052573@163.com
给的例子有点问题,如果我输入超过5位数,虽然会倒序输出,但是最后一个数字可能会有好几位,比如之下的这种情况:
0 也是整数,根据那个判断,0 不满足任何一个条件,特殊情况没有特殊处理。
以下方法可供参考:
/* 1、输入以字符串的形式获取 2、获取字符串之后,自定义一个函数,把开头的0去掉 3、根据自定义函数返回值的长度进行处理 (1)返回值长度为0,给字符串就赋值为0 (2)长度大于0并且小于5,不做额外处理 (3)长度大于5,只保留前五位,并且认为长度就为5 4、利用for循环进行逆序输出 5、如果想要处理更多位数的数字,只需要修改宏定义即可 */ #include <stdio.h> #include <string.h> #define NUM_LENGTH 5 //超过5位数保留前5位 char *deal_zero(char *str, int len); //把输入的字符串前边的所有0去掉 int main( ) { unsigned char str[32] ={0} ; unsigned char *temp_str = NULL; unsigned char result_str[32] = {0}; int i = 0, len = 0; printf("请输入 %d 位数字:", NUM_LENGTH); scanf("%s", str); temp_str = deal_zero(str, strlen(str)); len = strlen(temp_str); if(len == 0) { len = 1; result_str[0] = '0'; } else if(len > NUM_LENGTH) { len = NUM_LENGTH; strncpy(result_str, temp_str, len); } else strncpy(result_str, temp_str, len); printf("这是一个%d位数,逆序输出 : ", len); for(i = 0; i < len; i++) { printf("%c ", result_str[len - i - 1]); } printf("\n"); return 0; } char *deal_zero(char *str, int len) { if(str[0] == '0') { strncpy(str, str+1, len--); deal_zero(str, len--); } return str; }木子李
Li1***052573@163.com
阿立
139***6940@qq.com
使用递归思想,输入数字的同时记录按了几次键,就代表有几位数字。
#include<stdio.h> /* 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字 */ int count = 0; void p(){ char ch; if ((ch = getchar()) != '\n') { count = count + 1; p(); } if (ch != '\n') { printf("%c",ch); } } int main() { p(); printf("%d",count); while (1); return 0; }阿立
139***6940@qq.com
LKXXX
lkx***qq.com
思路: 利用字符串的简便性让 for 和 strlen 配合将 a 字符串(输入的字符串)逆序复制给 b 字符串。
#include<stdio.h> #include<string> int main() { int i; char a[100],b[100]; printf("请输入一个数:"); scanf("%[^\n]s",&a); for(i=0;i<=strlen(a);i++) b[i]=a[strlen(a)-1-i]; printf("'%s'是一个%d位数\n逆序输出为'%s'\n",a,strlen(a),b); return 0; }以上实例输出结果为:
LKXXX
lkx***qq.com
hello world
182***8342@qq.com
改变 X 可以增大数字范围到 10^X,还可以标识位数。
#include <stdio.h> #include <math.h> #define X 5 int main() { int num,bit[X],i,j; scanf("%d",&num); if(num<0||num>int(pow(10,X))) //出错判断 printf("error"); else { for(i=0;num!=0;i++) { bit[i]=num%10;//存储每一位 num=(num-num%10)/10; } printf("这是一个%d位数\n",i); for(j=0;j<=i-1;j++) printf("10^%d位:%d\n",j,bit[j]); } return 0; }以上的输出结果:
hello world
182***8342@qq.com