PAT A1049 Counting Ones

题目难度:三颗星
题目大意:给出一个数字,要求求出1-N之间的数字中出现1的个数。
题目坑点:题目就在于怎么求这个1的个数,我刚开始直接循环,很显然,肯定会超时,自己看了下算法笔记的解法,才知道。。。我曹这也太精彩了吧。
记录思路:对于每一位上可能出现1的次数进行计算,如果该位为0,那么此前的数值从000到该位之前的数值减一,都可以使得该位为1,同时需要乘以一个a,这个a就是当前所在的位的10的几次方;如果为1,那么就需要另行计算,因为如果为1,那么该位之前的数值为该数值的时候,在右侧的部分就只能小于等于该部分,于是需要加上一个右侧+1(因为有000);如果大于1,那么左侧可以取到的范围就要加一,然后乘以a即可。
代码如下:

/*
开始没写对 超时 
*/
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
int main(){
	int N,count=0;
	cin>>N;
	int left,right,now,a=1;
	while(N/a!=0){
		left=N/(a*10);
		now=N/a%10;
		right=N%a;
		if(now==0){
			count+=left*a;
		}
		else if(now==1){
			count+=(left*a+right+1);
		}
		else
			count+=a*(left+1);
		a*=10;
	} 
//	for(int i=1;i<=N;i++){
//		int temp=i;
//		while(temp>0){
//			if(temp%10==1)
//				count++;
//			temp/=10; 
//		}
//	}
	cout<<count;
}

你可能感兴趣的:(PAT,Advanced)