想必有人说:整数分解有什么说的,不过是一堆数进行排序罢了。
我认为这个整数分解关系到自己对于以前学的循环的选择以及在未知的条件下进行条件的判断,这对于刚学C语言的我是一个巨大的进步,这不仅提高我的思维能力而且在以后的竞赛以及笔试的编程来说正反馈是巨大的,因此我想要把它分享,进而对自己也是一个表达组织能力和掌握能力的一个练习。
1.我们从简单开始:(整数的分解的基础知 )若任意的整数,将它进行分解其中的各个数字:假设这个数字为X
1.个位数字: 让这个数对10求余 即(x%10)的值就是X的个位数字
2.十位数字:刚才我们得到了个位数字,所以个位数字 没有用了,我们可以把个位数字扔了
就是X/10,然后就得到了剩下的数,然后在用现在的数%10就得到了十位数字
举个例子:如果X=68,个位数字=68%10,十位数字=(68/10)%10
3.这种思想其实可以总结为 ‘% 10’ 可以认为是得到最后一个数字,而‘ /10’ 可以认为扔掉最后一个数字,然而这种思想可以用于以后的题目中。
初级:将一个数字逆序排列
1.我们可以按照以上的思想来将数字分解,每分解一次就输出,所以就运用了循环的思想。
#include<stdio.h>
int main ()
{ //整数的逆序排列(普通类)
int x = 0;
int d = 0;//个位数字
scanf("%d", &x);//输入的任意整数
do
{
d = x % 10;
printf("%d ", d);
x = x / 10;
} while (x > 0);
return 0;
}
这个比较简单,我们不做分析。
有人认为你的不具有代表性,应该举一个特殊的例子 如700,好,我们就举一个这样的例子
这样就完美了,所有对于任意的一个整数,我们已经完全掌握了将它的数字逆序排列,我们为我们鼓掌
二.那么能不能将一个整数逆序排列之后组成一个新的数
我认为应该掌握一点:就是将一个每一个数字进行往前提一位
这个应该怎么实现呢?
假设:d为个位数字,ret为结果
因为需要每一个数字往前提一位,必然用到循环
#include<stdio.h> int main() { int x = 0; int d = 0; printf("请输入一个整数"); scanf("%d", &x); int ret = 0; do { d = x % 10; ret = ret * 10 + d;//将数向左退一位//这个很关键 x = x / 10; } while (x > 0); printf("x=%d,ret=%d", x, ret); return 0; }
其中的ret=tet*10+d十分关键,这个可以抽象为一个公式:将一个数字往前挪移位
进阶:将一个整数按顺序进行分解
假设一个数字为359(我们利用一般的来推公式)
1.分解百位:359/100=3(这个100与359的位数相同)
2.扔掉百位:359%100=59
3.100/10=10(接下来要用10)
4.分解十位:59/10=5
5.扔掉十位:59%10=9
综上:100、10都是十分重要的。
//整数按顺序进行分解 int x = 0; printf("请输入一个任意整数"); scanf("%d", &x); int num = 0; printf("请输入一个与这个整数位的特殊的数,例如位数为3,就输100 !"); scanf("%d", &num); int d = 0; do { d = x / num; printf("%d ", d); x %= num; num = num / 10; } while (num > 0);
这样我们得到了整数按顺序排列
我们觉得1000这个数还要自己输入,这有点不智能,所以我们进行改进
高阶:智能化分解整数
我们怎么得到这个1000呢?
我们可以利用以前整数x的位数来求:
#include<stdio.h> //更加智能化的进行整数分解 int x = 0; int mark = 1; int t = 0; printf("请输入一个整数"); scanf("%d", &x); t = x;//保留x的值,不让x的值变为零 while (t > 9) { t=t/ 10;//通过循环加上 ‘/10’的方法可以算出他的位数 mark *= 10;// 通过位数来得到想要10的位数减一次方 } do { int d=x / mark; printf("%d", d); if (mark > 9) { printf(" "); } x %= mark; mark /= 10; } while (mark > 0); return 0; }
这些例子都是正确的,因此高阶的我们也学会了