递归公式出来了
已知 1<=a<=99 ,j={0,1}
f(j)=a
求 x>=100的问题 即j>1
的时候
对于 以1为最高位的
f(2)=((x+1)%100)+f(j) 此时的a=x%100
按照我上述算法推出
f(3)=((x+1)%10x10x10)+f(2)
此时的a=x%1000;
对于1不是最高位的
f(2)=f(j)
f(3)=f(2)
这个鸟毛的递归调用就是要靠什么 表达式推理要正确,俺是个数学白痴份子,推到这 还请各位考究
这个只是计算出了 数在区域0-99 a[j]00-a[j]99
a[j]000-a[j]999 区间的数字带1的总数
还得加上前面的数才对,我的天 睡着了,突然想到 我的推理的范围在哪
还得加上块外的数据才对快外 假如 1个数是1500
上面的算法就只能计算出1000-1500范围内的个数
1000以下的并未计算在内,所以俺得接着推
1000以下的函数,两者相加 才能满足要求。
0-99 数是20 100-199 数是100+20=120 200-299 20 300-399 20
知道了
除了100-199的数据是得
用100-999={100+20,20,20,20,20,20,20,20,20,20}
这个地方怎么那么像 咱们给出的 表 0-99 和 100-19
也就是20*10+100 =300
1000-1999
1000+300 2000-2999
300
3000-3999 300
1 2 3 4 5 6 7 8 9 ={1000+300,300,300,300,300,300,300,300,300}
1000+300*10=4000
这样就很清楚了
已知f(1)=20
f(1)=jisuan(99)=20
f(2)=10*f(1)+10*10
f(3)=10*f(2)+10*10*10
归纳出
f(n)=f(n-1)*10+10的N次方
由于计算是计算出了他当前的块中的个数 那么就的把那个块给不算在内,数最高的位决定块 所以
n=j-1
这个递归函数位置 不够了 我在下一个版面给补上 取名为 int jishu2(int n,int m) 这个函数是计算低1位的个数
比如 现在要求的是1500 那么这个函数计算的个数就是0-999的
如果是2500 或者3500
那么还剩下1部分没加上去 那么就是 a[j]-1>1&&j>=2 满足这个要求才能进行计算
睡不着啊 接着改 这部分值很好求 f(n)=f(n-1)*10+10的N次方的
10 改下个a[j]-1
就可以了。大家重新看 F(1) F(2) f(3)的算法 其实他们就单个来说只有个9个数相加 第10个数是加了他上一层得dao de数据
所以
a[j]此时 用公式
(f(n)-10的N次方)*(a[j]-1)/10 可以计算得到。
也就是 最高位 a[j]
这个就可以一直往后推了
刚才给出的算法求解函数得合并下
才能进行递归调用
int jishu(int num)
{
int num1,i,j,n,n1=1,m;
i=num;
for(i=i/10;i>0;i=i/10 ){
a[j]=i%10;
%是不是求余啊 搞忘记了
反正这个地方是求余的地方,5/10的余数是不是为5呢? 脑袋晃悠了 弄不楚
j++;
用 j 记下 数有个位
位 说的是个十百千万
}
a[j]=i%10;
因为最后一个余数在循环体内是取不到的
if(j<=1)
j={0,1} 为0 代表只有各位数 1代表10位,这个判定的就是0-99的数值了 总共是100个
{
if(num>=1&&num<9)
当他为各位的时候 NUM1是为各位的情况了的
{
num1=1;
}
if(num=0)
这个是用在大数求解的情况的 假如数字是 100呢 就完蛋了 没这个就完蛋
{
num1=0;
}
if(a[j]==1){
a[j]的值存放的是数的十位
对应的是 10-19 这个部分的
if(a[j-1]>=1)
num1=a[j-1]+2;
else
num1=1;
num1+=1;
}
else if(a[j]>=1){
这个对应的是 20-99部分的
if(a[j-1]>=1)
num1=1;
else
num1=0;
num1+=a[j]-1+11;
}
}
else
{
for(n=j;n>0;n--)
这个是为了计算 10*10*10的
n1=10*n1;
if(a[j]==1)
num1=(num+1)%n1+jishu((num1+1)%n1);
递归函数了 照着推理上面的函数套用就可以了,递归求解问题都是什么
F(X)=F(X的表达式)+。。。。。什么类型的
else
num1=jishu((num1+1)%n1);
}
if(j>1)
{
num3=jishu2(j-1);
num1=num1+num3;
}
if(a[j]-1>1&&j>2)
{
num4=((nun3-n1/10)*(a[i]-1))/10+n1/10;
num1=num1+num4;
}
return num1;
}
以上代码未经本人上机测试 ,只可作为算法
参考,深夜构思算法 在代码或者算法的正确性方面不能做出保证,还请各位老师和同学们给予指正
[
本帖最后由 zhu224039 于 2012-8-29 12:51 编辑 ]