1 #define _CRT_SECURE_NO_WARNINGS//vs编译器去除scanf的警告 2 #include3 //倒叙输出,输入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\n", 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-i49 //其实属于小学找规律的题50 }51 return final_num;52 }
上面的算法可以达到目的,备注也比较清晰了,但这属于基础级。
我们要翻转,首先要数据分离,求得输入数字的位数,求输入数字位数就是一个简单的分离,而我们要想使用最后的数据,又需要结合。
下面展示一个同样达到效果的程序,出自GF之手(^(* ̄(oo) ̄)^);
1 #include2 int main() 3 { 4 int n; 5 scanf("%d", &n); 6 while (n) { 7 printf("%d", n % 10); 8 n /= 10; 9 }10 printf("\n");11 return 0;12 }
这份代码非常简洁的完成了要求,倒序输出,但却是毫无意义的。
第一,这个只是单纯的输出,没有真正可利用的数据,只有分离没有结合;
第二,写了这个代码之后,以后需要类似代码还是得重新写,比如我需要倒序之后加10.1输出;
第三,复用性不够,也就是第二点提出的问题,我们需要写出一个算法之后,在以后的代码开发过程中可以复用,所以应该把他们封装成函数接口供以调用。。。
数学高手些的实现方法:
#define _CRT_SECURE_NO_WARNINGS//vs编译器去除scanf的警告#includeint 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\n",final_num); return 0;}
这个需要一定的数学思维,分析算法并有自己的设计思想。
算法,是一步步锻炼起来的。