当前位置: 代码迷 >> C语言 >> [求助]一个递推题,总错第九个数据
  详细解决方案

[求助]一个递推题,总错第九个数据

热度:369   发布时间:2007-08-13 18:10:36.0

我刚刚测验过 19500那个数据 他应该用的 5 120 来测试的 在我这 5 120 输出的就是 19500 根本不是 19497


----------------解决方案--------------------------------------------------------
可是用那个进制法求为什么第九个数据就AC呢?
----------------解决方案--------------------------------------------------------
我的int和double版都被我的高精度程序给覆盖了,所以只能把我的高精度程序发出来

#include<stdio.h>
#include<math.h>
typedef int SUN;
SUN s[2005][12]={0};
void q(SUN m[],SUN n[],SUN x[])
{
int i;
for(i=11;i>0;i--) { x[i]+=m[i]+n[i]; x[i-1]+=x[i]/10; x[i]=x[i]%10; }
}
void p(SUN m,SUN n,SUN x[])
{
int i,j;
int r=11;
x[r]=1;
for(i=0;i<n;i++)
{
for(j=11;j>=r;j--)
{
x[j]*=m;
}
for(j=11;j>=r;j--)
{
x[j-1]+=x[j]/10;
x[j]=x[j]%10;
}
if(r-3>-1) r-=3;
}
}

int main(void)
{
int K,N;
int i,t=2,j=2;
scanf("%d%d",&K,&N);
s[1][11]=1;
s[2][11]=K%10;
s[2][11]=K/10;
while(j<N+2)
{
for(i=1;i<j;i++) q(s[i],s[j],s[i+j]);
j=j+i;
p(K,t,s[j]);
t++;
}
i=1;
while(!s[N][i++]) ;
for(--i;i<12;i++)
printf("%d",s[N][i]);
return 0;
}

结果与int一样
----------------解决方案--------------------------------------------------------

这个是我的 算法好像一样吧
#include <stdio.h>
#include<math.h>
int main()
{
int k ,n,i,j,m,t,L,y;
int a[1000]={0};
a[0]=1;
while(scanf("%d%d",&k,&n)!=EOF){
j=1,t=0,L=1,y=2;
for(m=0;m<n;m++)
{
if(j+1==y){
y=y*2;
t=pow(k,L++);
a[j++]=t;
i=0;
continue;
}
a[j++]=t+a[i++];
}
printf("%d",a[n-1]);

}
}


----------------解决方案--------------------------------------------------------
回复:(mp3aaa)以下是引用leeco在2007-8-12 22:24:5...
什么叫算不到N 1000?
----------------解决方案--------------------------------------------------------
以下是引用leeco在2007-8-13 18:32:43的发言:
什么叫算不到N 1000?

15 1000
为什么我的不可以呢? 大哥给诊断一下拉


----------------解决方案--------------------------------------------------------
回复:(mp3aaa)以下是引用leeco在2007-8-13 18:32:4...

/*---------------------------------------------------------------------------
File name: vijos1319.c
Author: HJin (email: fish_sea_bird [at] yahoo [dot] com )
Created on: 8/13/2007 03:46:19
Environment: Windows XP Professional SP2 English +
Visual Studio 2005 v8.0.50727.762


Modification history:
===========================================================================

I think Leeco and my algorithm work. Mine has to be modified a little bit.

Here is a AC submission:

R431946 Accepted 100 From hjin- P1319 GCC Vivid Puppy 2007-8-13 18:41:25

==================(submitted code)=============================
main(){int k,N,s,p;while(scanf("%d%d",&k,&N)!=-1){s=0;p=1;while(N){if(N&1)s+=p;p*=k;N>>=1;}printf("%d\n",s);}}
*/


main()
{
int k, N, s, p;
while(scanf("%d%d", &k, &N)!=-1)
{
s=0;
p=1;
while(N)
{
if(N&1)
s+=p;

p*=k;
N>>=1;
}

printf("%d\n", s);
}
}


----------------解决方案--------------------------------------------------------
回复:(mp3aaa)以下是引用leeco在2007-8-13 18:32:4...
15 1000的结果超int型了,我过了说明他测试数据没那么刁钻。
15 1000应该是41189262750,用unsigned够了
----------------解决方案--------------------------------------------------------

你和leeco的算法一样么
就是把 /2换成了>>1 了

[此贴子已经被作者于2007-8-13 18:54:05编辑过]


----------------解决方案--------------------------------------------------------
以下是引用leeco在2007-8-13 18:51:56的发言:
15 1000的结果超int型了,我过了说明他测试数据没那么刁钻。
15 1000应该是41189262750,用unsigned够了

题目明确说明:保证输出数据在2^31以内,所以表示用int完全可以,不需要用极端数据15 1000测试,我用过unsigned,同样过6个数据


----------------解决方案--------------------------------------------------------
  相关解决方案