PAT 1049 Counting Ones (30 分)

mac2024-01-30  40

#include <cstdio> int main() { //从低位到高位,now为当前数字,left为now左边组成的数字,right为now右边组成的数字 //累计当前为now可能出现的1的个数即为答案 int n,left=0,right=0,a=1,now=1,ans=0; scanf("%d",&n); while(n/a) { left=n/(a*10),now=n/a%10,right=n%a; //如果now为0,说明now位只有在left从0到left-1的时候会出现1,所以产生left个1,而右边会重复a次 if(now==0) ans+=left*a; //如果now==1,较上一种情况会多出当now为1,右边出现从0到right个数 else if(now==1) ans+=left*a+right+1; //now>=2,左边0到left会在now位置产生1,出现(left+1)次,右边出现a次 else ans+=(left+1)*a; a*=10; } printf("%d",ans); return 0; }
最新回复(0)