两天一题系列:
准备鞭策自己瞎做个两天一题系列,关于每题写一篇感悟和理解。
题目:
摘自力扣,题号258。
假设给定数为非负整数,将该非负整数各位相加,直至最终相加之和为一位数,返回这个一位数。
知识点:
A 循环(循环相加给定数各个位,直至返回数为0)
B 数组(若采取将给定数的每个数都放入数组中,依次相加)
思路:
Ⅰ:利用数组
- 定义一个数组,将给定数的各个位上的数历遍放在数组中。
- 将数组中的每位相加,并将结果再次放入这个数组中。
- 判断数组的长度是否为1,若为1,则返回该数组中的数;若不为1,则循环步骤1、2。
Ⅱ:普通循环:
- 利用取余取整的方法循环将给定数及计算后的各位相加相加。
脑子做到了,代码做不到,真码起来觉得思路又不对。那个啥,一天看题目,一天闭环。
未闭环代码:
static int getNum(int addNum) {
//先尝试将两位数相加
// int a = 0;//放取余的数
int num = 0;//两数之和
while(addNum > 10) {//递进应该是?
addNum = addNum/10;
num += addNum%10;
System.out.println("addNum:"+addNum+"addNum/10:"+addNum/10);
System.out.println("num:"+num+"addNum%10:"+addNum%10);
if(num < 10) {
return num;
}else {
num = addNum;
}
}
return num;
}
11-27:闭环
知识点:
- 取整:以下即为取整,设b=32409,则numN=3240。
int numN = b/10;
- 取余:以下为取余,设b=32409,则num = 9。
int num = b%10;
扩展:
只能完成一次循环,将给定数各个位数相加,并返回相加的值,但不能完成将给定数各个位数持续相加,直至返回值为一位数。
将给定数各个位数相加并返回这个和的程序如下:
我一定缺少了能使该循环再次循环的条件
思路:
真是笨方法!
- 依次相加给定数的各个位上的数,并将结果记录在新的变量中,且这个变量为该方法的返回值。
- 在循环内判断相加后的结果是否<10。若小于10,则返回该数;若不小于10,则另给定数的变量等于这个新的变量,且初始化这个变量后进入新一轮循环。
- 直至相加各个位上的数小于10.
注意:
需对给定数进行大于10的判断,若给定数小于10,则另新变量直接等于给定数,并返回即可。
代码:
static int getNum(int addNum) {
//先尝试将两位数相加
int num = 0;//两数之和
int numN = 0;
if(addNum < 10) {
return addNum;
}
while(addNum >= 10) {//递进应该是?
numN = addNum/10;
System.out.println("addNum:"+numN);
num += addNum%10;
System.out.println("num:"+num);
addNum = addNum/10;
if(addNum < 10) {
num += addNum;
if(num > 10) {
addNum = num;//若num大于10,则
num = 0;//将num初始化
}else if(num == 10){
num = 1;
return num;
}
}
}
return num;
}
结果如下:
还需再闭环。