当前位置: 首页 > article >正文

整数的分离与合成

整数的分离与合成

  • 一、整数的分离
    • 1.1 整数拆成数字的方法
      • 1.1.1 取尾法
      • 1.1.2 取头法
    • 1.2 任意整数的分离
  • 二、整数的合成

整数是由数字和数位组成的,比如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;
}

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


http://www.kler.cn/a/507688.html

相关文章:

  • DNS介绍(3):应用场景
  • 数据结构之哈希表详解
  • 【Block总结】WTConv,小波变换(Wavelet Transform)来扩展卷积神经网络(CNN)的感受野
  • 【论文阅读笔记】基于YOLO和ResNet深度卷积神经网络的结直肠息肉检测
  • 【SQL】查询前三名
  • STM32 FreeRTOS 任务创建和删除实验(动态方法)
  • 机器学习和深度学习是人工智能(AI)领域的两个重要分支,它们都依赖于数学、统计学和计算机科学的基础知识。
  • Ubuntu系统备份与还原
  • ECCV2020 | YAILA | 又一种中间层攻击方法
  • 如何进行域名跳转与域名重定向的综合指南
  • 一个悄然崛起的开源项目,已开源
  • JavaScript 变量与数据类型
  • WEB攻防-通用漏洞_XSS跨站_MXSS_UXSS_FlashXSS_PDFXSS
  • PCL 新增自定义点类型【2025最新版】
  • 【Vim Masterclass 笔记16】S07L32 + L33:同步练习09 —— 掌握 Vim 宏操作的六个典型案例(含点评课内容)
  • 实战指南:使用Wireshark捕获并解密HTTPS数据包
  • 深度学习模块C2f代码详解
  • 利用PyQt6实现HIS系统差异化数据的定时增量分析
  • sqlite3.OperationalError: database is locked python-BaseException错误解决
  • KubeSphere部署安装,接入KubeKey安装的k8s集群