PAT-1049 Counting Ones

1049 Counting Ones(30 分)

The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1's in 1, 10, 11, and 12.

Input Specification:

Each input file contains one test case which gives the positive N (≤2​30​​).

Output Specification:

For each test case, print the number of 1's in one line.

Sample Input:

12

Sample Output:

5

 

    统计前N个整数(十进制)中“1”的个数,找规律吧,我是分别统计每一位上“1”出现的次数,加起来就好了。

#include<stdio.h>
#include<sstream>
#include<string>
using namespace std;

int string2int(string s){
	if(s.length()==0)
		return 0;
	int i;
	stringstream stream(s);
	stream >> i;
	return i;
}

int main(){
	char n[15];
	scanf("%s",n);
	int count=0;
	string st(n);
	for(int i=0;i<st.size();i++){
		int k=i+1;
		int bit=st[st.size()-k]-'0';
		int pre=string2int(st.substr(0,st.size()-k));
		int post=string2int(st.substr(st.size()-k+1));

		if(bit==0){
			int j=k-1;int tmp=pre;
			while(j--)
				tmp*=10;
			count+=tmp;
		}else if(bit==1){
			count+=post+1;
			int j=k-1;int tmp=pre;
			while(j--)
				tmp*=10;
			count+=tmp;
		}else if(bit>1){
			int j=k-1;int tmp=pre+1;
			while(j--)
				tmp*=10;
			count+=tmp;
		}
	}
	printf("%d",count);

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值