1的数目

来源:互联网 发布:windows closewait 编辑:程序博客网 时间:2024/03/29 14:17

(1)法一

#include<iostream>using namespace std;typedef unsigned __int64 ULONGLONG;ULONGLONG Count1InAInteger(ULONGLONG n){    ULONGLONG iNum=0;    while(n)    {        iNum+=(n%10==1)?1:0;        n/=10;    }    return iNum; }ULONGLONG f(ULONGLONG n){    ULONGLONG iCount=0;    for(ULONGLONG i=1;i<=n;i++)iCount+=Count1InAInteger(i);    return iCount;}int main(){    ULONGLONG n=123;    cout<<f(n)<<endl;    return 0;}

(2)法二
给定一个正整数N,假设它的第i位为B,B的高位部分为A,B的低位部分为C,N=(A)B(C)=A*10^i+B*10^(i-1)+C。考虑第i位B:
1.B<1,从(0)1(0)到(A-1)1(10^i-1),都小于(A)B(C),总共有A*10^i个数;
2.B=1,从(0)1(0)到(A-1)1(10^i-1),从(A)1(0)到(A)1(C),都不大于(A)B(C),总共有A*10^i+C+1个数;
3.B>1,从(0)1(0)到(A)1(10^i-1),都小于(A)B(C),总共有(A+1)*10^i个数。

#include<iostream>using namespace std;typedef __int64 LONGLONG;typedef unsigned __int64 ULONGLONG;LONGLONG Sum1s(ULONGLONG n){    ULONGLONG iCount=0;    ULONGLONG iFactor=1;    ULONGLONG iLowerNum=0;    ULONGLONG iCurrNum=0;    ULONGLONG iHigherNum=0;    while(n/iFactor)    {        iLowerNum=n%iFactor;        iCurrNum=(n/iFactor)%10;        iHigherNum=n/(iFactor*10);        switch(iCurrNum)        {        case 0:            iCount+=iHigherNum*iFactor;            break;        case 1:            iCount+=iHigherNum*iFactor+iLowerNum+1;            break;        default:            iCount+=(iHigherNum+1)*iFactor;        }        iFactor*=10;    }    return iCount; }int main(){    ULONGLONG n=123;    cout<<Sum1s(n)<<endl;    return 0;}
3)x的个数(1<=x<=9)
#include<iostream>using namespace std;typedef __int64 LONGLONG;typedef unsigned __int64 ULONGLONG;LONGLONG Sumxs(ULONGLONG n,int x){    ULONGLONG iCount=0;    ULONGLONG iFactor=1;    ULONGLONG iLowerNum=0;    ULONGLONG iCurrNum=0;    ULONGLONG iHigherNum=0;    while(n/iFactor)    {        iLowerNum=n%iFactor;        iCurrNum=(n/iFactor)%10;        iHigherNum=n/(iFactor*10);        if(iCurrNum<x)iCount+=iHigherNum*iFactor;        else if(iCurrNum==x)iCount+=iHigherNum*iFactor+iLowerNum+1;        else iCount+=(iHigherNum+1)*iFactor;        iFactor*=10;    }    return iCount; }int main(){    ULONGLONG n=123;    for(int i=1;i<=9;i++)cout<<Sumxs(n,i)<<endl;    return 0;}
0 0