整数的分离与合成
整数是由数字和数位组成的,比如327是一个三位数,它的数字是3、2、7,数位是个数、十位、百位。
经常有些题目考查将一个整数拆分成各个数字,以及将各个数字合成一个整数,下面分别就此讨论。
注:只考虑正整数,只涉及整数拆成单个数字,单个数字合成整数的情况,不考虑整数拆成多个整数,多个整数合成一个整数的情况。
一、整数的分离
1.1 整数拆成数字的方法
把一个整数分离成各个数字,比如一个三位数327分离成3、2、7,需要用到除法、取余运算,运算符分别为“/”、“%”。
有两种算法:一种是一个接一个从数的尾部向头部取数,我称“取尾法”;一种是一个接一个从头部向尾部取数,我称“取头法”。
1.1.1 取尾法
依次去尾:327→32→3。采用除法实现:327/1=327,327/10=32,327/100=3。
依次取尾:7→2→3。采用取余%实现:327%10=7,32%10=2,3%10=3。
这是通用方法,取最高位和最低位是有更简化的算法。
①最低位直接对10取余数即可。
②最高位直接除以
1
0
n
−
1
10^{n-1}
10n−1即可(n是这个整数的位数),比如求327的最高位:327/100=3。
按这种方式分离一个三位数的代码如下:
#include <stdio.h>
int main(){
int num, one, ten, hundred;
scanf("%d", &num);
one = num%10;// 获取个位
ten = num/10%10;// 获取十位
hundred = num/100;// 获取百位
printf("%d %d %d\n", hundred, ten, one);
return 0;
}
1.1.2 取头法
依次去头:327→27→7。采用取余%实现:327%1000=327,327%100=27,327%10=7。
依次取头:3→2→7。采用除法实现:327/100=3,27/10=2,7/1=7。
按这种方式分离一个三位数的代码如下:
#include <stdio.h>
int main(){
int num, one, ten, hundred;
scanf("%d", &num);
hundred = num/100;// 获取百位
ten = num%100/10;// 获取十位
one = num%10;// 获取个位
printf("%d %d %d\n", hundred, ten, one);
return 0;
}
以上两种方式都可实现整数的拆分,但显然第一种方式更好理解,而且也更具通用性,因为每次都除以10再对10取余,不用变来变去。
1.2 任意整数的分离
可以利用“取尾法”的上述优点分离任意一个整数。
代码如下:
#include<stdio.h>
int main(){
int num,n;
scanf("%d", &num);
while(num>0){
n = num%10; // 取最后一位数字
printf("%d", n);
num/=10; // 去除最后一位数字
if (num > 0) {
printf(" "); // 只在数字之间打印空格
}
}
printf("\n");
return 0;
}
这段代码很简洁,但有一个小缺点,就是从低位向高位输出,与原数字是反向的。如果要正向输出,可以将变量存入数组后再输出。
另外,还可以利用这段代码输出原整数是几位数,只要再定义一个初值为0的变量(计数器),然后在while循环中自加就行了。
二、整数的合成
将各个数字合成一个整数就很简单了,比如将3、2、7结合成整数327:327=3100 + 210 + 7*1
合成的一个三位数的代码:
#include <stdio.h>
int main(){
int num, one, ten, hundred;
scanf("%d%d%d", &hundred, &ten, &one);
num = hundred*100 + ten*10 + one*1;
printf("%d\n", num);
return 0;
}
但是整数的合成还涉及到一个较为复杂的问题,就是如果不知道整数的位数,就比较麻烦了,如果要用上面算法,就要先求出这个数是几位数,因此降低了效率。
对比,有一种更高效的合成数的算法,参见:
合成数的高效算法
原文地址:https://blog.csdn.net/jjmhx/article/details/145183125
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!