问题描述
输入正整数n,判断从1到n之中,数字1一共要出现几次。例如1123这个数,则出现了两次1。例如15,那么从1到15之中,一共出现了8个1。
输入格式
一个正整数n
输出格式
一个整数,表示1出现的资料
样例输入
15
样例输出
8
数据规模和约定
n不超过30000
题解:
看到这个题的第一反应就是先把数字转化成字符串,在对字符串中每个数字进行判断是否是字符串“1”,如果是,就对temp进行加一操作。代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
scanner.close();
int temp=0;
for(int i=1;i<=n;i++) {
//从1循环到n
String string=i+"";
for(int j=0;j<string.length();j++) {
//当是两位数及以上时,就要对每位上的数进行判断
char a=string.charAt(j);
boolean status=(a+"").contains("1");
if(status) {
temp++;
}
}
}
System.out.println(temp);
}
}
测评结果:
虽然结果是通过了评测,但是总感觉自己的方法不是很好,于是又去查找了大佬的做法。果然,大佬的方法就是简洁,明了。
题解:
下面的代码主要是通过对每个数字进行10的取余和取整运算来进行判断是否包含数字1。
代码如下(地址:https://blog.csdn.net/a1439775520/article/details/104214711):
import java.util.Scanner;
public class 一的个数 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//使用完输入流要及时得关闭,防止占内存
sc.close();
//先把所有得变量都声明了
int count = 0,a,b;
for (int i = 1; i <= n; i++) {
//用一个变量代替,如果更改i就会更改循环
a=i;
//和水仙花数一样得方法,取最后一位,/10删除最后一位
while (a!=0){
b=a%10;
if (b==1) count++;
a/=10;
}
}
System.out.println(count);
}
}
测评结果: