int numberOfOnes(const char* str)
{
	if(str == NULL || *str < '0' || *str > '9' || *str == '\0')
	{
		return 0;
	}
	int first = *str - '0';
	unsigned int length = static_cast<unsigned int>(strlen(str));

	if(length == 1 && first == 0)
	{
		return 0;
	}
	if(length == 1 && first > 0)
	{
		return 1;
	}

	//假设str是"21345", numFirstDigit是10000~19999中1的数目
	int numFirstDigit = 0;
	if(first > 1)
	{
		numFirstDigit = powerBase10(length - 1);
	}
	else if(first == 1)
	{
		numFirstDigit = atoi(str + 1) + 1;
	}

	//numOtherDigit是数字10000~19999的第一位之外的数位中的数目
	int numOtherDigit = first * (length - 1) * powerBase10(length - 2);
	int numRecursive = numberOfOnes(str + 1);

	return numFirstDigit + numOtherDigit + numRecursive;
}
//方法二
int findOnesFromOneToN_Solution2(int n)
{
	if(n <= 0)
	{
		return 0;
	}
	char str[50];
	sprintf(str, "%d", n);

	return numberOfOnes(str);
}
示例#3
0
int main() {

    int n,m;

    scanf("%d %d",&n, &m);

    long long int * skills = malloc(n*(sizeof(long long int)));
    long long parsed;
    int i,j;
    char str[500][500];

    for(i=0;i<n;i++){
        char * ptr;
        scanf("%s",str[i]);

        //parsed = strtoll(str, & ptr, 2);
        // printf("%llX\n", parsed);
        //skills[i] = parsed;
    }

//    qsort(skills,n,sizeof(skills[0]),comp);

    long long maxteam=0;
    long long maxskill=0;
    long long  temp;
    for(i=0;i<n;i++){

        for(j=i+1;j<n;j++){

            temp = numberOfOnes(str[i],str[j],m);
            if(temp>maxskill){
                maxskill=temp;
                maxteam =1;
            }
            else if(temp == maxskill){
                maxteam++;
            }

        }
    }

  //maxskill = numberOfOnes(maxskill);
    printf("%lld\n%lld\n",maxskill,maxteam);

    return EXIT_SUCCESS;
}