您的位置:首页 > 其它

scau 1077 韩信点兵

2012-11-23 19:24 232 查看
//用中国剩余定理解决韩信点兵问题
#include <stdio.h>
long long max,x,m[8],b[8],M[8],n,N;
int p[8];

int main()
{
int i,j,k;
for(n=1,i=0; i<8; i++)
{scanf("%lld",&m[i]);  n=n*m[i];}  //读入除数数组,注意n,为所以除数的乘积

/***************检验n和m[]数组***************/
//printf("%lld\n",n);
//for(i=0; i<8; i++)
//    printf("%lld ",m[i]);
//printf("\n");                 //成功
/***************检验n和m[]数组***************/

for(i=0; i<8; i++)
scanf("%lld",&b[i]);          //读入余数数组
for(i=0; i<8; i++)
M[i]=n/m[i];                    //保存M数组
/****************检验b[]和M[]数组*******************/
//for(i=0 ; i<8; i++)
//    printf("%lld  %lld\n",b[i],M[i]);
//printf("\n");                        //成功
/****************检验b[]和M[]数组*******************/

for(i=0; i<8; i++)
{
for(k=1; ;k++)
if(  (k*M[i])%m[i]==1)
{p[i]=k;  break;}
}

/*******************输出p[]数组验证*******************************/
//for(i=0; i<8; i++) printf("%lld ",p[i]); printf("\n");
/*******************输出p[]数组验证*******************************/

for(N=0,i=0; i<8; i++)
N=(N+p[i]*M[i]*b[i]);

//printf("%lld\n",N);
//printf("%lld\n",n);
x=N%n;
for(max=m[0],i=0; i<8; i++)
{
if(m[i]>max) max=m[i];
}
if(x<max)  x=x+n;
printf("%lld\n",x);
/*for(N=0,i=0; i<8; i++)
N=N+p[i]*M[i]*b[i];
x=N%n;
printf("%lld\n",x);*/
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: