自学内容网 自学内容网

整数的分离与合成

整数是由数字和数位组成的,比如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} 10n1即可(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)!