算法循環(huán)求出每個(gè)數(shù)中1的個(gè)數(shù)

字號(hào):

算法思想:
    循環(huán)求出每個(gè)數(shù)中1的個(gè)數(shù),累計(jì)之,若滿足f(n)=n,則退出,否則繼續(xù)。
    代碼如下:
    /**//**************************
    * 0~n之間1的個(gè)數(shù),如f(13)=6
    * 1,2,3,4,5,6,7,8,9,10,11,12,13.1的個(gè)數(shù)為6
    * 要求:輸入一個(gè)正整數(shù)n,求出f(n),及求解f(n)=n
    ***********************/
    #include
    #include
    #include
    class CalculationTimes
    ...{
    public:
    CalculationTimes()...{}
    ~CalculationTimes()...{}
    int GetTimes(int n);
    };
    //計(jì)算正整數(shù)n中1的個(gè)數(shù)
    int CalculationTimes::GetTimes(int n)
    ...{
    int count=0;
    while(n)
    ...{
    if(n%10==1)
    count++;
    n/=10;
    }
    return count;
    }
    //顯示菜單
    void show_menu()
    ...{
    printf(\"--------------------------------------------- \");
    printf(\"input command to test the program \");
    printf(\" i or I : input n to test \");
    printf(\" g or G : get n to enable f(n)=n \");
    printf(\" q or Q : quit \");
    printf(\"--------------------------------------------- \");
    printf(\"$ input command >\");
    }
    void main()
    ...{
    char sinput[10];
    int n;
    show_menu();
    scanf(\"%s\",sinput);
    while(stricmp(sinput,\"q\")!=0)
    ...{
    int t=0,count=0;
    if(stricmp(sinput,\"i\")==0)
    ...{
    printf(\" please input an integer:\");
    scanf(\"%d\",&n);
    count=0;
    CalculationTimes obj;
    t=GetTickCount();
    for(int i=1;i<=n;i++)
    count+=obj.GetTimes(i);
    t=GetTickCount()-t;
    printf(\" count=%d time=%d \",count,t);
    }
    else if(stricmp(sinput,\"g\")==0)
    ...{
    CalculationTimes obj;
    n=2;
    count=1;
    t=GetTickCount();
    while(1)
    ...{
    count+=obj.GetTimes(n);
    if(count==n)
    break;
    n++;
    }
    t=GetTickCount()-t;
    printf(\" f(n)=n=%d time=%d \",n,t);
    }
    //輸入命令
    printf(\"$ input command >\");
    scanf(\"%s\",sinput);
    }
    }