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

    学习了大概两周的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");  

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

 

 

 

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值