c语言运行与调试不同,为什么调试和运行的结果不一致??求大佬指教

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

测试输入是:5 2000

答案是:2147483616

代码如下:

#include

#include#define min(x,y) ((x)

#define max(x,y) ((x)>(y)?(x):(y))

#define rep(i,a,b) for(i=(a);i<=(b);++i)

#define dwn(i,a,b) for(i=(a);i>=(b);--i)#define ll long long int

#define MAX 520

#define ARRMAX 60const int mod=1e4;

int k,n,times,p2;

struct newint{

int arr[ARRMAX];

int len;

}c[MAX],ans;struct newint add(struct newint a,struct newint b){

struct newint c;

c.len=max(a.len,b.len);

int x=0,i;

rep(i,0,c.len){

c.arr[i]=a.arr[i]+b.arr[i]+x;

x=c.arr[i]/mod;

c.arr[i]%=mod;

}

if(x>0)

c.arr[++c.len]=x;

return c;

}

struct newint multi(struct newint a,int b){

struct newint c;

c.len=a.len;

ll x=0;

int i;

rep(i,0,c.len){

c.arr[i]=(1ll*a.arr[i]*b+x)%mod;

x=(1ll*a.arr[i]*b+x)/mod;

}

while(x>0){

c.arr[++c.len]=x%mod;

x/=mod;

}

return c;

}

struct newint devices(struct newint a,int b){

struct newint c;

c.len=a.len;

ll x=0;

int i;

dwn(i,c.len,0){

c.arr[i]=(a.arr[i]+x*mod)/b;

x=(a.arr[i]+x*mod)%b;

}

dwn(i,c.len,1){

if(c.arr[i]==0) c.len--;

else break;

}

return c;

}

int main(){

int i;

for(i=0;i

c[i].len=0;

memset(c[i].arr,0,sizeof(c[i].arr));

}

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

p2=(1<

c[0].arr[0]=1;

rep(i,1,min(p2,n/k)){

c[i]=devices(multi(c[i-1],(p2-i+1)),i);

}

rep(i,2,min(p2,n/k)){

ans=add(ans,c[i]);

}

if(n/k<=p2){

c[p2]=c[n/k];

rep(i,1,times){

c[p2-i]=devices(multi(c[p2-i+1],(p2-i+1-n/k)),(p2-i+1));

ans=add(ans,c[p2-i]);

}

}

printf("%d",ans.arr[ans.len]);

dwn(i,ans.len-1,0){

printf("%04d",ans.arr[i]);

}

putchar('\n');

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值