整数的分离与合成

整数是由数字和数位组成的,比如327是一个三位数,它的数字是3、2、7,数位是个数、十位、百位。

经常有些题目考查将一个整数拆分成各个数字,以及将各个数字合成一个整数,下面分别就此讨论。

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

一、整数的分离

1. 整数拆成数字的方法

把一个整数分离成各个数字,比如一个三位数327分离成3、2、7,需要用到除法、取余运算,运算符分别为“/”、“%”。

有两种算法:一种是一个接一个从数的尾部向头部取数,我称“取尾法”;一种是一个接一个从头部向尾部取数,我称“取头法”。

(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取余数即可。

②最高位直接除以10的n-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;

}

(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取余,不用变来变去。

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=3*100 + 2*10 + 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;

}

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金创想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值