整数分解并正序输出-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");
最后终于大功告成了。谢谢阅读。
上一篇: JavaScript实现日期时间差的判断
下一篇: 对象新增
推荐阅读
-
C语言:从键盘上输入10个整数,求他们的平均值以及正数的个数,并加以输出
-
【C语言程序练习】从键盘输入两个整数,计算并输出他们的和、差、积、商t和平均值
-
C语言 二叉树 统计二叉树中度为0,1和2的结点个数【树和二叉树】给定先序序列,按照该序列创建对应的二叉树,并输出该二叉树度为0,1和2的结点个数。输入:一行,二叉树按先序遍历序列,空指针用字符^占位
-
一个正整数加上100之后是完全平方数,再加上100之后还是完全平方数, 编程求出这样的数并输出(在10000以内C语言实现)
-
数组|将数组中输入的5个整数利用起泡法从小到大进行排序并输出|大一在校大学生|C语言日常作业
-
C语言:求一组数中有几个数,并将其正序和逆序输出,并判断正负
-
获取一个整数的每一位,并正序输出(递归)
-
获取一个整数的每一位,并正序输出(递归)
-
C语言 正序分解整数
-
正序分解整数(C)