問題の説明
正の整数nを入力し、1からnまでの数字1が何回現れるかを決定します。たとえば、番号1123の場合、1は2回表示されます。たとえば、1から15までの15には、合計8つの1があります。
入力フォーマット
正の整数n
出力フォーマット
1が表示されるデータを表す整数。
サンプル入力
15
サンプル出力
8
データサイズと合意
nは30000を超えません
解決策:
この質問に対する最初の反応は、最初に数値を文字列に変換し、文字列内の各数値が文字列「1」であるかどうかを判断することです。そうである場合は、tempに1を追加します。コードは次のように表示されます。
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);
}
}
評価結果: