1049. Counting Ones (30)

第一次运行时有个一分的测试点超时了。。。

压缩了一点时间,不过感觉没什么区别,32的数就算32*32也耗不了多久

然后就过了

不过又把原先没改的再提交一遍也过了。。。

之后又提交了三四次也都过了,搞不懂。。。

这题找规律,0~9                        有1*1个

                        0~99                     有2*10个

                        0~999                   有3*100个

                        0~9999                有4*1000个

然后根据数的左边第一位是大于1还是等于1分两类计算

从高位算到十位

最后带上个位

例如:34122

           万位:计算0~29999                         有3*4*1000+10000

           千位:计算30000~33999                有4*3*100+1000

           百位:计算34000~34099                有1*2*10

                       计算34100~34122                有123(百位是1有100~122共123个)

           十位:计算34100~34119                有2*1*1+10

           个位:计算34120~34122                有1

#include<stdio.h>
#define MAX 50
int main(){
	int a[MAX]={0},temp[MAX]={0};
	int n=0;
	char c;
	temp[0]=1;
	c=getchar();
	while(c!='\n'){
		a[n]=(int)(c-'0');
		temp[n+1]=temp[n]*10;//temp[0]=1;temp[1]=10;temp[2]=100
		n++;
		c=getchar();
	}
	//printf("%d",i);
	int j=n;//数的位数 
	int sum=0;//记录个数 
	for(int i=0;i<n-1;i++){//只计算到十位,个位单独计算 
		sum+=a[i]*(j-1)*temp[j-2];//[0~a[i]*10^(j-i-1))范围内1的个数sum+=a[i]*(j-1)*10^(j-2)
		if(a[i]>1){
			sum+=temp[j-1];
		} 
		else if(a[i]==1){
			int temp2=0;
			for(int k=i+1;k<n;k++){
				temp2=temp2*10+a[k];
			}
			sum+=(temp2+1); 
		}
		j--; 
	}
	if(a[n-1]>=1) sum++;//计算个位 
	printf("%d\n",sum);
	
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值