问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

整数的分离与合成

创作时间:
作者:
@小白创作中心

整数的分离与合成

引用
CSDN
1.
https://blog.csdn.net/jjmhx/article/details/145183125

整数的分离与合成是编程中常见的操作,特别是在处理数字相关的问题时。本文将详细介绍如何将一个整数分离成各个数字,以及如何将各个数字重新组合成一个整数。文章通过具体的C语言代码示例,帮助读者理解并掌握这两种操作的基本方法。

整数的分离

整数是由数字和数位组成的,比如327是一个三位数,它的数字是3、2、7,数位是个位、十位、百位。经常有些题目考查将一个整数拆分成各个数字,以及将各个数字合成一个整数,下面分别就此讨论。

注:只考虑正整数,只涉及整数拆成单个数字,单个数字合成整数的情况,不考虑整数拆成多个整数,多个整数合成一个整数的情况。

整数拆成数字的方法

把一个整数分离成各个数字,比如一个三位数327分离成3、2、7,需要用到除法、取余运算,运算符分别为“/”、“%”。有两种算法:一种是一个接一个从数的尾部向头部取数,我称“取尾法”;一种是一个接一个从头部向尾部取数,我称“取头法”。

取尾法

依次去尾: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;
}

取头法

依次去头: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取余,不用变来变去。

任意整数的分离

可以利用“取尾法”的上述优点分离任意一个整数。代码如下:

#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;
}

但是整数的合成还涉及到一个较为复杂的问题,就是如果不知道整数的位数,就比较麻烦了,如果要用上面算法,就要先求出这个数是几位数,因此降低了效率。

对比,有一种更高效的合成数的算法,参见:合成数的高效算法

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号