求12的个数

来源:互联网 发布:试客联盟怎么绑定淘宝 编辑:程序博客网 时间:2024/06/08 07:09

给定正整数N,函数F(N)表示小于等于N的自然数中1和2的个数之和,例如:1,2,3,4,5,6,7,8,9,10序列中1和2的个数之和为3,因此F(10)=3。输入N,求F(N)的值,1=<N<=10^100(10的100次方)若F(N)很大,则求F(N)mod20123的值。


#include <stdio.h>

#include <string.h>


int calcMod(int n)
{
int ret=1 ;
int remain = n%5;


for (int i =0 ;i < n/5 ;i++)
{
ret *=10000;
ret%=20123;
}
for (int i = 0;i< remain;i++)
{
ret *=10;
}
ret%=20123;
return ret;
}


int calcTotal(char * pData,int len)
{
int res =0;
for (int i =0 ;i <len;i++)
{
res+= (pData[i]-'0')*calcMod(len-i-1);
}
return res;
}


int calcValue(int first,int n)
{
int ret = 0;
if (0==first)
{
if (n >0)
ret+=2*n*calcMod(n-1);
return ret ;
}
else if (1==first)
{
ret = calcMod(n);
if (n >0)
ret+=(first+1)*n*calcMod(n-1)*2;
return ret %20123;
}


ret = 2*calcMod(n);


if (n >0)
ret+=(first+1)*n*calcMod(n-1)*2;
return ret %20123;
}


int calc(char * pData,int len)
{
int total =0;
if (0==len)
return 0;
if ('0'==*pData)
return calc(pData+1,len-1);
if ('1'==*pData)
{
total = calcValue(0,len-1)+1;
total+=calcTotal(pData+1,len-1);
return (total+calc(pData+1,len-1))%20123;
}
if ('2'==*pData)
{
total = calcValue(1,len-1)+1;
total+=calcTotal(pData+1,len-1);
return (total+calc(pData+1,len-1))%20123;
}


total = calcValue(*pData-'0'-1,len-1);
return (total + calc(pData+1,len-1))%20123;


}
int main(void)
{
char number[512]="";
while (1)
{
printf("please input a number:");
scanf("%s",number);
if (0==strlen(number))
break;
int res = calc(number,strlen(number));
printf("res = %d \n",res);
}
getchar();
return 0;
}
原创粉丝点击