三种算法获取一个整数的每个数字

来源:互联网 发布:淘宝网iphone6s外壳 编辑:程序博客网 时间:2024/05/29 15:08
// getnumber.cpp : Defines the entry point for the console application.//// Author:shizhixin  // Email:szhixin@gmail.com  // Blog:http://blog.csdn.net/shizhixin  // Date:2012-05-06/*晚上无法入眠,随手翻开床头的编程珠玑看看,做了做第三章的第8题,突然想做这样一个获取一个整数每个数字的小程序,比如输入1131,输出1 1 3 1程序给出了实现这个的三个算法,大致可以总结:第一种方法是从大到小先取模后做除法,正序输出第二种方法是从小到大先取模后做除法,不过做完后要逆序去零输出第三种方法是先做除法后取模个人认为第二种算法优于第一种,第三种算法优于第二种,或许是我思维的一个过程,所以感觉总要有点进步才更新算法吧。如果有更好更简单的算法实现的程序,欢迎交流!*/#include "stdafx.h"#include <math.h>const int MAX_NUM_BIT = 5;//参数异常判断bool assert_para(int n){if (n<=0 || n>pow(10,MAX_NUM_BIT)){printf("input number must be > 0 and < pow(10,MAX_NUM_BIT)!");return false;}return true;}/*算法思想是先对10的幂从大到小取模如果取模后的值与原来的值相等,则表示还未达到数的位数,继续下一幂如果不等,则表示开始输出数但是考虑到中间有零的情况,一旦开始输出数,有相等情况应该是有0造成的*/void func_getnumber1(int n){    if (!assert_para(n))    {return;    }bool start = false;int m,k;for (int i=MAX_NUM_BIT; i>=0; i--){m=n%int(pow(10,i));if (m!=n){start = true;k = n/int(pow(10,i));printf("%d ",k);n=m;}else{if (start){printf("0 ");}}}}/*算法思想是从小到大开始取模并输出个位十位等数,然后将结果逆转并去掉前面的0输出*/void func_getnumber2(int n){    if (!assert_para(n))    {return;    }int m,k[MAX_NUM_BIT];for(int i=1;i<=MAX_NUM_BIT;i++){m = n%int(pow(10,i));k[i-1] = m/int(pow(10,i-1));}bool flag = false;for (i=MAX_NUM_BIT; i>0; i--){if (k[i-1]!=0){flag = true;}if (flag){printf("%d ",k[i-1]);}}}/*算法思想是直接从大到小的幂做除法运算,如果位数不够,除数为零,不做输出,直到开始输出第一个数后,就算除法为零也输出结果*/void func_getnumber3(int n){    if (!assert_para(n))    {return;    }int m;bool start = false;for (int i=MAX_NUM_BIT; i>=0; i--){m = n/int(pow(10,i));if (m!=0 || start){start = true;printf("%d ",m);n = n%int(pow(10,i));}}}int main(int argc, char* argv[]){int num = 0;printf("use the func_getnumber1:  ");func_getnumber1(num);printf("\n");printf("use the func_getnumber2:  ");func_getnumber2(num);printf("\n");printf("use the func_getnumber3:  ");func_getnumber3(num);printf("\n");return 0;}


原创粉丝点击