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