1356: 小E和1
时间限制: 1 Sec 内存限制: 128 MB提交: 151 解决: 30
题目描述
因为小e的名字中e和1谐音,所以小e对1这个数字情有独钟。一天小e上完数学课之后,突然有一个想法,
他想统计一下[1,n]这n个整数的十进制表示中有多少个1?意气风发的小e,信手捏来,就是一段代码:
int count1(unsigned int n){
int count = 0;
while(n > 0){
if(n%10 == 1) count++;
n /= 10;
}
return count;
}
int count1Between1toN(unsigned int n){
int count = 0;
for(unsigned i = 1; i <= n; i++){
count += count1(i);
}
return count;
}
追求完美的小e认为自己的代码还不够完美,聪明的ACMer能够帮助小e写出一份完美的代码吗?
他想统计一下[1,n]这n个整数的十进制表示中有多少个1?意气风发的小e,信手捏来,就是一段代码:
int count1(unsigned int n){
int count = 0;
while(n > 0){
if(n%10 == 1) count++;
n /= 10;
}
return count;
}
int count1Between1toN(unsigned int n){
int count = 0;
for(unsigned i = 1; i <= n; i++){
count += count1(i);
}
return count;
}
追求完美的小e认为自己的代码还不够完美,聪明的ACMer能够帮助小e写出一份完美的代码吗?
输入
输入有多组数据。
每一组数据包括一行。
第一行包含一个整数n(0 ≤ n ≤ 10^18)输出
对于每组测试用例,输出一行,包含测试用例编号
(
从
1
开始
)
和一个整数。该整数表示
[1,n]
这
n
个整数的十进制表示中包含
1
的个数。
样例输入
9
11
样例输出
Case 1:1
Case 2:4
提示
例如n=11,则[1,11]中包含1的整数为有1,10,11。一共4个1,故最后答案为4.
//by-四川⼤学 _⽅巍
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
int main(){
long long n;
int ca = 0;
while (scanf("%lld",&n)==1) {
ca++;
long long ans = 0;
long long tem = 1;
long long m = n;
while (n) {
ans += n/ 10 * tem;
if (n%10 == 1) {
ans += m%tem + 1;
}else if (n %10){
ans += tem;
}
n/=10;
tem *= 10;
}
printf("Case %d:%lld\n",ca,ans);
}
return 0;
}