求1到N之间整数中出现1的个数

来源:互联网 发布:深圳燕麦科技知乎 编辑:程序博客网 时间:2024/04/29 03:17

1、方法1

先来个例子:

n=3241

(1)千位中1的个数n/1000=3>11X1000个

(2)百位中1的个数n/100=3232的个位是2>=1(3+1)X100=400个

(3)十位中1的个数n/10=324324的个位是4>=1(32+1)X10=330个

(4)个位中1的个数n/1=32413241的个位是4>=1(324+1)X1=325个

共计1000+400+330+325=2055个


code

#include "stdafx.h"#include <iostream>#include <string>#include <stack>using namespace std; int mySum1s(int n) {int temp=n;int div=1;int cnt=0;while(temp!=0){temp/=div;div*=10;}div/=10;int a,b;while(div!=0){a=n/div;if(a>0 && a<10){if(a==1){cnt+=n-a*div+1;}else{cnt+=div;}}else{b=a%10;if(b>0){cnt+=(a/10+1)*div;}else{cnt+=a/10*div;}}div/=10;}return cnt; }int main(int arc, char** argv){int cnt=0;cnt=mySum1s(3241);cout<<cnt<<endl;system("pause");return 0;}


2、方法2

例子101

(1)个位上的1:101/10=10101%10=1>010x1+(1-0)=11

(2)十位上的1:101/100=1101%100=1<101x10+0=10

(3)百位上的1:101/1000=0101%1000=101>990+(101-99)=2

code

#include "stdafx.h"#include <vector>#include <iostream>using namespace std;int numOfOnes(int num){int n=0;int temp=num;while(temp!=0){n++;temp/=10;}int div=1;int sum=0;while(n--){div*=10;int a=num/div;int b=num%div;if(div/10-1<b && b<2*div/10){sum+=a*div/10+(b-div/10+1);}else if(b>=2*div/10){sum+=a*div/10+div/10;}else{sum+=a*div/10;}}return sum;}int main(void){int n=112;int cnt=numOfOnes(n);cout<<"The number of one is "<<cnt<<"."<<endl;system("pause");return 0;}



0 0
原创粉丝点击