欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

整数分解并正序输出-C语言

程序员文章站 2022-03-21 23:10:32
...

    学习了大概两周的C语言基础,今天终于进行了第一次做了一个比较搞脑子的程序,虽然代码是我自己一个一个敲的,但是,是在MOOC上的C语言入门课做的反馈。
    很多时候我觉得,学习代码一定要自己手敲一遍,虽然手敲的速度非常的慢,但是我保证如果听课的理解是50%,那么手敲代码会让你理解80%,有人问还有20%去哪了,哈哈那就再实战中获取吧。

    第一篇博客,往往词不达意,还望谅解。

    接下来就开始复述我的整数分解的学习过程,很简单啊!!!
 


    首先呢,有几个小要求,就是这个X必须是自主输入的随机的,因为这个原因我们是没办法直接从第一位开始获取数字的,因为我们不知道最高位是多少,或许是十位百位or亿亿亿亿位哈哈哈。

    所以这个程序的初步思想就是,我从末尾开始取咯,难道你还没有末尾吗?取出你的末尾,然后我再把你往前推一位,嗯,可以简单的。于是程序就这样出来了。scanf了一个X进去。

 

 

//此处省略了输入,输入一个已知的数X,将它的每一位倒序输出

int t=0;//给定的0,做媒介的
	do{
		int d=x%10;      //取出x的个位,也就是最后一位
        t = t*10+d;    //将刚才取出的位数往前顶一位,意思就是个位的变成十位,十位变成百位。。。
		x/=10;    //x的最后一位已经被利用过了,取走了,所以将他整除10,扔掉末位数
	}while(x>0);    //只要x没有被我们压榨干净,我们就要继续循环,直到把他的每一位都榨干然后倒叙输出
	printf("x=%d,t=%d\n",x,t);    //输出
	
	x = t;        //这个t就是我们刚才倒叙输出的数
	do{
		int d = x%10;      //老套路,将这个数的末尾剥离出来
		printf("%d",d);    //然后输出这个数
		if(x>=10){
			printf(" ");    //每输出最后一位就打空格,美观,除了最后一个数字不用打空格,所以是x>=10的时候才需要大J空格
		}
		x/=10;
	} 	while(x>0);
	printf("\n"); //最后来一个潇洒的回车

感觉写的挺好的啊,有兴趣的同志复制黏贴一下就可以了,别忘了加上一些基础要素。

 

好那么是不是就是大功告成了呢,非也,因为编写程序的时候还需要思考一些边界条件也就是特殊情况,比如说我输入1000会怎么样呢?最后的结果就是0,因为中间我们有一个把位数往前推的过程,如果说剥离下来的位数是0,那么0*10是毫无作用的。于是程序就出错了。OK,那么下一步就要改进,把这个0给保留下来。


先谈谈思路。如果我们能够知道这个数有几位数,是不是就方便多了,我们就从头上开始,何必从尾巴开始呢。于是我们该怎么获取他的位数呢?OK你应该明白了,我就整除。

/*x=12345;  思路 
     12345/10000=1
     12345%10000=2345
     10000/10=1000
     2345/1000=2
     2345%1000=345
     1000/10=100
     345/100=3
     345%100=45
     100/10=10
     45/10=4
     45%10=5
     10/10=1
     5/1=5
     5%1=5
     1/10=0   */


所以:

    int x;
 	scanf("%d",&x);
 	int mask = 10000;//这是一个用来控制次数的变量。这里我们先假设x都是万级别的,已知输入数字的数量级
 	do{
 		int d = x/mask;
 		printf("%d",d);
 		if(x>9){
 			printf(" ");
		 }
 		x%=mask; //问题出在这里7000%1000=0!!!! 所以while的条件应该是mask为零,x零就零了呗 
 		mask/=10;
 		printf("x=%d,mask=%d,d=%d\n",x,mask,d);
	 }while(x>0);//条件应该是mask>0 
	 printf("\n");   这套算法的问题就是对于70000这种带零的他没法正确的输出。 
	 

好,同样思考一个问题,循环结束的条件能不能是x>0的时候?

不能,因为如果这个X的值最后几位就是0呢,不就又前功尽弃了吗

 

这个代码的缺点就是判断条件还是用x来判断,前面讲过了,就算x没有整除完,我x也可以0结尾,你能说我是除完了吗,不能呗。

因此,判断条件最好是用mask这个控制变量来控制。意思就是我的整除不受你X末尾是否为零影响,我只管你是几位数!


 int x;
 	scanf("%d",&x);
 	int mask = 10000; //假设这是一个万位的数
 	do{
 		int d = x/mask;
 		printf("%d",d);
 		if(mask>9){  //这里也要改,保证空格没问题。 
 			printf(" ");
		 }
 		x%=mask;  
 		mask/=10;
 		//printf("x=%d,mask=%d,d=%d\n",x,mask,d);
	 }while(mask>0);
	 printf("\n");   //问题来了,能不能输入多少,我的mask就是多少呢,能不能自动呢?

现在我们终于不用被零困扰了,那么就要思考的高级一点了,是否可以我随意输入一个数字,即使你不知道位数的大小呢?显然是可以的。那就是我先对你的X进行处理。靠整除的次数来知道你的位数。


int x;
	int t;
	  	  
 	scanf("%d",&x);
 	t = x;
 	int mask = 1;
 	while(x>9){
 		x/=10;//此时的x已经被改变过了,所以还需要一个中间变量t让他复原哦! 
 		mask = mask*10; //整除一次就叠加一次,最后得出的就是位数
	 }
	 x = t; //刚才的X被处理过一遍了,在赋值一遍
 	do{
 		int d = x/mask;
 		printf("%d",d);
 		if(mask>9){  
 			printf(" ");
		 }
 		x%=mask;  
 		mask/=10;
 		//printf("x=%d,mask=%d,d=%d\n",x,mask,d); //检测用的代码
	 }while(mask>0);
	 printf("\n");  

最后终于大功告成了。谢谢阅读。