1 #define _CRT_SECURE_NO_WARNINGS//vs编译器去除scanf的警告
2 #include<stdio.h>
3 //倒叙输出,输入12345,输出54321,输入的位数不定
4 int get_digit(int digit);
5 int getlg_n(int n);
6 int final_operate(int num, int wei);
7 int main(void)
8 {
9 int num;
10 scanf("%d", &num);
11 int wei=get_digit(num);
12 printf("%d
", final_operate(num, wei));
13 return 0;
14 }
15 /*得到输入数字的位数*/
16 int get_digit(int digit)
17 {
18 int bit_cout = 0;
19 while (digit)
20 {
21 bit_cout++;
22 digit /= 10;
23 }
24 return bit_cout;
25 }
26 /*得到10的几次方*/
27 int getlg_n(int n)
28 {
29 int res = 1;
30 for (int i = 0; i < n; i++)
31 {
32 res *= 10;
33 }
34 return res;
35 }
36 /*完成算法
37 num:输入的数字
38 wei:求得的位数
39 return:最终的翻转数字
40 */
41 int final_operate(int num,int wei)
42 {
43 int turn_bit = 0, final_num = 0;
44 for (int i = 0; i < wei; i++)
45 {
46 turn_bit = num % 10;//得到最后一位
47 num /= 10;//为了得到每个数字做的约束
48 final_num += turn_bit*getlg_n(wei - 1 - i);//思考为什么要wei-1-i
49 //其实属于小学找规律的题
50 }
51 return final_num;
52 }
上面的算法可以达到目的,备注也比较清晰了,但这属于基础级。
我们要翻转,首先要数据分离,求得输入数字的位数,求输入数字位数就是一个简单的分离,而我们要想使用最后的数据,又需要结合。
下面展示一个同样达到效果的程序,出自GF之手(^(* ̄(oo) ̄)^);
1 #include<stdio.h>
2 int main()
3 {
4 int n;
5 scanf("%d", &n);
6 while (n) {
7 printf("%d", n % 10);
8 n /= 10;
9 }
10 printf("
");
11 return 0;
12 }
这份代码非常简洁的完成了要求,倒序输出,但却是毫无意义的。
第一,这个只是单纯的输出,没有真正可利用的数据,只有分离没有结合;
第二,写了这个代码之后,以后需要类似代码还是得重新写,比如我需要倒序之后加10.1输出;
第三,复用性不够,也就是第二点提出的问题,我们需要写出一个算法之后,在以后的代码开发过程中可以复用,所以应该把他们封装成函数接口供以调用。。。
数学高手些的实现方法:
#define _CRT_SECURE_NO_WARNINGS//vs编译器去除scanf的警告
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int final_num = 0,wei;
while (n)
{
final_num *= 10;//循环乘10,为了实现后面的加法得到最终结果
wei = n % 10;//取最后一位
final_num += wei;//每次循环都需要乘以10再加上来,也就是把分离的过程提到一步完成
n /= 10;
}
printf("%d
",final_num);
return 0;
}
这个需要一定的数学思维,分析算法并有自己的设计思想。
算法,是一步步锻炼起来的。