使用语言:Java
for循环与字符串
2019.Java C组第一题
小明对数位中含有2,0,1,9的数字很感兴趣,在1到40中这样的数有28个,他们的和为574,从1到2019,所有这样的数的和是多少?
思路分析1:获取1-2019每个数字的千位(不为0)百位,十位,个位,将每一个数字和2,0,1,9这四个数字进行比较,若存在,累加到变量中
思路分析2:将数字转化为字符串,获取每一位数字
public class demo1{
public static void main(String[] args){
//定义变量用于统计结果
int count=0;
//在范围内进行循环
for(int i=1;i<=2019;i++){
//将数字转化为字符串
String j=i+"";
//将字符串转化为字符数组,toCharArray
char[] cs=j.toCharArray();
//遍历数组与数字进行对比
for(int k=0;k<cs.length;k++){
if(cs[k]=='2'||cs[k]=='0'||cs[k]=='1'||cs[k]=='9'){
count+=i;
break;
}
}
}
System.out.println(count);
}
}
注意事项:1.count结果的打印要在循环外层,即代码运行完成的地方
2.进行count累加后记得加上break-->否则一个数字可能会累加多次,如2019,四个数字都会符合, 如果不加break,则会累加4次,导致运行结果错误
3.字符和字符串计算长度的比较:char->length && String->length()
2015.Java C组第二题
一些数字的立方的末尾正好是该数字本身,比如:1,4,5,6,9,24,25...请你计算一下,在10^4以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个
思路分析:已知循环次数,用for循环。可以将数字和数字的立方转成字符串--->str.endWith(str2):判断字符串str是否以字符串str2结尾
public class demo2{
public static void main(String[] args){
int count=0;
for(int i=1;i<=10000;i++){
//计算该数字的立方值
//使用long类型而不是int类型
//int类型的最大值为2^31-1,使用long类型可避免整数溢出
long cube=(long)i*i*i;
//将数字和数字的立方都转变为字符串
String numStr=Integer.toString(i);
String cubeStr=Long.toString(cube);
if(cubeStr.endsWith(numStr)){
count++;
}
}
System.out.println(count);//36
}
}
2019.JavaC组第二题
小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方形,剩下一块矩形,然后再切割剩下的矩形材料,知道全部切成正方形为止。例如:对于一块两边分别为5和3的材料(记为5*3),小明会依次切出3*3, 2*2, 1*1 ,1*1共4个正方形。现有一块矩形的材料为2019*324,问小明最终会切出多少个正方形?
思路分析:每次切割最大的正方形后,剩余部分仍为矩形,重复此过程直到全部变为正方形,切割次数=每次切割的正方形数量的总和--->使用辗转相除法
public class demo3{
public static int countSquares(int a, int b) {
//统计结果
int count=0;
//当较小边不为零时继续切割
while(b!=0){
//确保a是最大边
if(a<b){
int temp=a;
a=b;
b=temp;
}
//当前切割的正方形数量
int squares=a/b;
//累加到总数
count+=squares;
//剩余边长
int reminder=a%b;
//更新边长,继续处理剩余部分
a=b;
b=reminder;
}
return count;
}
public static void main(String[] args){
//函数调用
System.out.println(countSquares(2019,324));//21
}
}