给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
示例:
输入: 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。
来源:力扣(LeetCode)
AC的C
int countDigitOne(int n) {
int num=n,s=0;
long i=1;
while(num){ //分别计算个、十、百......千位上1出现的次数,再求和。
if(num%10==0)
s=s+(num/10)*i;
if(num%10==1)
s=s+(num/10)*i+(n%i)+1;
if(num%10>1)
s=s+ceil(num/10.0)*i;//ceil()返回大于或者等于指定表达式的最小整数
num=num/10;
i=i*10;
}
return s;
}
java
import java.util.Scanner;
public class Shuziyi {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner in = new Scanner(System.in);
int n=in.nextInt();
int count = 0;
long l=0,cur=0,h=0,num=1;
while(n/num !=0){
l=n%num;
cur=(n/num)%10;
h=n/(num*10);
if(cur<2){
count += h*num;
if(cur==1){
count += l+1;
}
}else{
count += (h+1)*num;
}
num=num*10;
}
System.out.println(count);
}
}
python
class Solution:
def countDigitOne(self, n):
cnt, i = 0, 1
while i <= n: # i 依次个十百位的算,直到大于 n 为止。
cnt += n // (i * 10) * i + min(max(n % (i * 10) - i + 1, 0), i)
i *= 10
return cnt
核桃的数量
小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
1. 各组的核桃数量必须相同
2. 各组内必须能平分核桃(当然是不能打碎的)
3. 尽量提供满足1,2条件的最小数量(节约闹***嘛)
程序从标准输入读入:
a b c
a,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)
程序输出:
一个正整数,表示每袋核桃的数量。
例如:
用户输入:
2 4 5
程序输出:
20
再例如:
用户输入:
3 1 1
程序输出:
3
C
#include<stdio.h>
int main(){
int a,b,c,i=1;
scanf("%d %d %d",&a,&b,&c);
while(i++>0){
// for(i=0;;i++){
if(i%a==0 && i%b==0 && i%c==0){
printf("%d",i);
break;
}
}
return 0;
}
Java
import java.util.Scanner;
/* * 1.两两找最大公约数 ; * 2.再找出最小公倍数求积*/
public class Hetao {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
int c = in.nextInt();
int i=1;
while(i++>0){
if(i%a==0 && i%b==0 && i%c==0){
System.out.print(i);
break;
}
}
}
}
python
a,b,c=map(int,input().split())
list=[]
if a<30 and b<30 and c<30:
sum=a*b*c
for i in range(1,sum+1):
if i%a==0 and i%b==0 and i%c==0:
list.append(i)
print(list[0])