1 題目重述
輸入一個整數(shù) n,請計算并返回該整數(shù)「各位數(shù)字之積」與「各位數(shù)字之和」的差
例如:
輸入:567
返回:192
解釋:
? ? 1.各位數(shù)字之積:5×6×7=210
? ? 2.各位數(shù)字之和:5+6+7=18
? ? 3.差:210-18=192
2 題目分析
2.1 題目梳理
拿到題目蝇棉,我們要對題目進(jìn)行分析涣旨,找到題目中所蘊(yùn)含的關(guān)鍵信息
本題中的關(guān)鍵字:輸入、整數(shù)n峦剔、各位數(shù)字、積角钩、和、差
由此递礼,我們要做的第一件事就是獲取鍵盤上的輸入惨险,且輸入必須為一個整數(shù)。
其次脊髓,獲取該整數(shù)的各位數(shù)字。
進(jìn)而求得各位數(shù)字之積和各位數(shù)字之和将硝。
最后,進(jìn)行做差運(yùn)算依疼。
2.2 實(shí)現(xiàn)思路
1.鍵盤輸入一個整數(shù)創(chuàng)建Scanner類的對象input痰腮,并傳入?yún)?shù)System.in 代表系統(tǒng)輸入流。使用Scanner類的nestInt()方法獲取整型數(shù)字n涛贯。
2.獲取各位數(shù)字思路1:首先诽嘉,我們從數(shù)學(xué)中 被除數(shù)?除數(shù)=商+余數(shù) 這一點(diǎn)可以知道弟翘,當(dāng)除數(shù)為10時,只會對數(shù)字進(jìn)行小數(shù)點(diǎn)的前移而不改變每一位數(shù)字的值稀余。其次,通過整數(shù)對10取余睛琳,可以得到該整數(shù)的個位數(shù)字踏烙。通過整數(shù)除以10取商历等,可以該整數(shù)的大小讨惩,對整數(shù)進(jìn)行降位操作(即將n位整數(shù)變?yōu)閚-1位整數(shù)寒屯,且不改變該整數(shù)每一位數(shù)字)。反復(fù)多次寡夹,直到該整數(shù)等于0,這樣就提取出了該整數(shù)的每一位數(shù)字菩掏。這里要用到的語法:循環(huán)結(jié)構(gòu)(這里采用的是while循環(huán) )
思路2:我們知道整型是基本數(shù)據(jù)類型,沒有調(diào)用方法野揪,也無法直接獲取每一位數(shù)字。但是字符串類型是引用數(shù)據(jù)類型囱挑,可以調(diào)用charAt()方法提取字符串中的每一個元素沼溜。基于此系草,我們思考是否可以將整型轉(zhuǎn)換成字符串類型唆涝。幸運(yùn)的是,String類型為我們提供了這樣一個方法廊酣,采用String類的valueOf()方法可以將其他數(shù)據(jù)類型轉(zhuǎn)換成字符串類型能耻。于是我們采用String.valueOf()方法將整型轉(zhuǎn)換成字符串類型,從而采用String類的charAt()方法提取出字符串中的每一個數(shù)字字符亡驰∠停可是我們也知道字符雖然有對應(yīng)的是ASCII碼,但無法進(jìn)行計算凡辱,也就無法實(shí)現(xiàn)我們的需要戒职。于是我們還需要將每一個字符轉(zhuǎn)換為整型透乾,從而進(jìn)行數(shù)字之間的計算磕秤。這一過程被拆分為兩個部分,第一部分是將字符轉(zhuǎn)換成字符串類型市咆,那么首先要將獲取的字符轉(zhuǎn)換為字符串再来,依舊采用String類的valueOf()方法可以將字符類型轉(zhuǎn)換成字符串類型。第二部分是將字符串類型轉(zhuǎn)換成整型其弊,我們知道Integer是int的包裝類型,可以調(diào)用方法痹雅,采用Integer類的parseInt()方法,可以將字符串類型轉(zhuǎn)換為整型绩社,從而實(shí)現(xiàn)字符型到整型的轉(zhuǎn)換赂苗。
3.進(jìn)行做差運(yùn)算對我們得到的數(shù)字分別進(jìn)行累加和累積,并將結(jié)果分別保存在sum和mul中拌滋。
3 代碼實(shí)現(xiàn)
3.1 方式一:通過對10取余的方式獲取每一位數(shù)字
3.1.1 代碼如下:
//1獲取一個整數(shù)n
Scanner input=new Scanner(System.in);
// System.in 代表系統(tǒng)輸入流
System.out.println("請輸入一個整數(shù):");
int n=input.nextInt();
//nextInt()方法限制輸入必須為整型
System.out.println("輸入數(shù)字為:"+n);
//2獲取該整數(shù)的每一位數(shù)字
//2.1 默認(rèn)和為0,積為1(積為0的話就沒有辦法累積了哦赌渣,畢竟0乘任何數(shù)都為0)
int sum=0, mul=1;
//2.2 判斷數(shù)字是否為0
while(n !=0) {
? ? //2.3 獲取整數(shù)的各位數(shù)字
? ? int num=n %10;
? ? //2.4 累積
? ? mul *=num;
? ? //2.5 累加
? ? sum+=num;
? ? //2.6 對整數(shù)進(jìn)行降位(即改變當(dāng)前數(shù)字的大胁獭)
? ? n /=10;
}
//3進(jìn)行做差計算
int result=mul-sum;
//4輸出
System.out.println("運(yùn)算結(jié)果為:"+result);
3.1.2 代碼結(jié)果:
請輸入一個整數(shù):
567
輸入數(shù)字為:567
運(yùn)算結(jié)果為:192
3.2 方式二:通過類型轉(zhuǎn)換獲取每一位數(shù)字
3.2.1 代碼如下:
//1獲取一個整數(shù)n
Scanner input=new Scanner(System.in);
// System.in 代表系統(tǒng)輸入流
System.out.println("請輸入一個整數(shù):");
int n=input.nextInt();
System.out.println("輸入數(shù)字為:"+n);
//2獲取該整數(shù)的每一位數(shù)字
//2.1 默認(rèn)和為0,積為1
int sum=0, mul=1;
//2.2 將數(shù)字轉(zhuǎn)化為字符串鸿竖,使用String類的.charAt()方法提取字符串中的每個元素
// 整型=>字符串
String strNumber=String.valueOf(n);
for(int i=0; i < strNumber.length(); i++) {
? ? char c=strNumber.charAt(i);
? ? //2.3 將字符轉(zhuǎn)化為字符串铸敏,再將字符串轉(zhuǎn)化為整型缚忧,進(jìn)行運(yùn)算
? ? // 字符=>字符串=>整型
? ? // 分步實(shí)現(xiàn)
//? String str=String.valueOf(c);
//? int num=Integer.parseInt(str);
? ? // 組合實(shí)現(xiàn)
? ? int num=Integer.parseInt(String.valueOf(c));
? ? //2.4 累積
? ? mul *=num;
? ? //2.5 累加
? ? sum+=num;
}
//3進(jìn)行做差計算
int result=mul-sum;
//4輸出
System.out.println("運(yùn)算結(jié)果為:"+result);
3.2.2 代碼結(jié)果:
請輸入一個整數(shù):
567
輸入數(shù)字為:567
運(yùn)算結(jié)果為:192
3.3 方式三:如果你的程序中需要多次計算搔谴,可以將實(shí)現(xiàn)的代碼寫作方法,在主函數(shù)中調(diào)用即可敦第。
3.3.1 代碼如下:
public static void main(String[] args) {
? ? //1.獲取輸入數(shù)字
? ? Scanner input=new Scanner(System.in);
? ? System.out.println("請輸入數(shù)字:");
? ? int n=input.nextInt();
? ? System.out.println("輸入數(shù)字為:"+n);
? ? //2.調(diào)用方法并輸出
? ? // 方法1:
? ? System.out.println("計算結(jié)果1:"+diff1(n));
? ? // 方法2:
? ? System.out.println("計算結(jié)果2:"+diff2(n));
}
// 方法1:
public static int diff1(int n) {
? ? //1.默認(rèn)和等于0,積等于1
? ? int sum=0, result=1;
? ? //2.判斷數(shù)字是否為0
? ? while(n !=0) {
? ? ? ? //3.獲取當(dāng)前數(shù)字的個位
? ? ? ? int num=n %10;
? ? ? ? //4.進(jìn)行計算
? ? ? ? //4.1累加
? ? ? ? sum+=num;
? ? ? ? //4.2累乘
? ? ? ? result *=num;
? ? ? ? //5.改變當(dāng)前數(shù)字的大小
? ? ? ? n=n /10;
? ? }
? ? return result-sum;
}
?
// 方法2:
public static int diff2(int n) {
? ? //1.默認(rèn)和等于0鞠呈,積等于1
? ? int sum=0, result=1;
? ? //2.將整型轉(zhuǎn)化為字符串類型
? ? String strNumber=String.valueOf(n);
? ? //3.獲取字符串的每個字符
? ? for(int i=0; i < strNumber.length(); i++) {
? ? ? ? char c=strNumber.charAt(i);
? ? ? ? //4.類型轉(zhuǎn)換
? ? ? ? // 字符=>字符串=>整型
? ? ? ? String s=String.valueOf(c);
? ? ? ? int num=Integer.parseInt(s);
? ? ? ? //5.進(jìn)行計算
? ? ? ? sum+=num;
? ? ? ? result *=num;
? ? }
? ? return result-sum;
}
3.3.2 代碼結(jié)果:
請輸入數(shù)字:
567
輸入數(shù)字為:567
計算結(jié)果1:192
計算結(jié)果2:192
如有錯誤右钾,請大家批評指正。