C语言的竞赛题,韩信点兵

南风咖啡 2008-12-19 10:22:27
相传汉高祖刘邦问大将军韩信统御兵士多少,韩信答说,每3人一列余1人、5人一列余2人、7人一列余4人、13人一列余6人、17人一列余2人、19人一列余10人、23人一列余1人、29人一列余11人。

刘邦茫然而不知其数。你呢?
你是一位优秀的程序员,请你帮刘邦解决这一问题。
要求由键盘输入A,B,C,D,E,F,G,H,a,b,c,d,e,f,g,h十六个数,分别代表每A人一列余a、每B人一列余b、每C人一列余c、每D人一列余D、每E人一列余e、每F人一列余f、每G人一列余g、每H人一列余h,其中A,B,C,D,E,F,G,H为互不相等的质数
输出总兵士数,要求输出满足条件的最小的一个,但要满足8种排法的每一种排法至少可排一列。(保证给的数据,有结果且计算的结果不会超过2的63次方)

(注意这个题的难点是控制边界值的溢出,在C语言中只有double类型是64位,而且double类型不能用求余%的。麻烦那位大侠给解一下)下面是我的代码可是有溢出,long类型是32位


#include"stdio.h"
#include"math.h"
main()
{
int a,b,c,d,e,f,g,h,A,B,C,D,E,F,G,H;
long i,sum=0;
scanf("%d %d %d %d %d %d %d %d",&A,&B,&C,&D,&E,&F,&G,&H);
scanf("%d %d %d %d %d %d %d %d",&a,&b,&c,&d,&e,&f,&g,&h);
for(i=2;i<pow(2,63);i++)
{
if(i%A==a&&i%B==b&&i%C==c&&i%D==d&&i%E==e&&i%F==f&&i%G==g&&i%H==h)
{

sum=i;
break;
}
}
printf("%ld",sum);
}
...全文
1207 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bfhtian 2008-12-19
  • 打赏
  • 举报
回复
嗯,中国剩余定理
FWing 2008-12-19
  • 打赏
  • 举报
回复
你在网上搜一下“中国剩余定理”
或者《算法导论》也有。
可以直接算的,不用这样枚举。在这里复制一堆公式定理啊没什么意义。

另外,我记得可以用long long类型可以用来计算64位。
lbh2001 2008-12-19
  • 打赏
  • 举报
回复
说点题外话,“在C语言中只有double类型是64位,而且double类型不能用求余%的”
虽然在C语言中不能用%对浮点数求余,但C库里有个函数可以弥补

#include <math.h>
double fmod( double x, double y );
The fmod() function returns the remainder of x/y.

C语言还是很强大的
liyudefly 2008-12-19
  • 打赏
  • 举报
回复
不知道你们讨论什么内容,不过这个题好像人为的妖魔化了,很简单的几句代码就行。
#include<iostream>
using namespace std;
/*相传汉高祖刘邦问大将军韩信统御兵士多少,韩信答说,每3人一列余1人、5人一列余2人、7人一列余4人、13人一列余6人、
17人一列余2人、19人一列余10人、23人一列余1人、29人一列余11人。刘邦茫然而不知其数。你呢?
你是一位优秀的程序员,请你帮刘邦解决这一问题。要求由键盘输入A,B,C,D,E,F,G,H,a,b,c,d,e,f,g,h十六个数,分别代表
每A人一列余a、每B人一列余b、每C人一列余c、每D人一列余D、每E人一列余e、每F人一列余f、每G人一列余g、每H人一列余h,
其中A,B,C,D,E,F,G,H为互不相等的质数输出总兵士数,要求输出满足条件的最小的一个,但要满足8种排法的每一种排法至少
可排一列。(保证给的数据,有结果且计算的结果不会超过2的63次方)*/
void main()
{
for(unsigned long int H = 40;H < 4294967260 ;H += 29)
{
if(H % 23 == 1)
{
if(H % 19 == 10)
{
if(H % 17 == 2)
{
if( H % 13 == 6)
{
if( H % 7 == 4)
{
if( H % 5 == 2)
{
if( H % 3 ==1)
{
cout<<"H="<<H<<endl;
}
}
}
}
}
}
}
}
}


计算结果:
H=224399662
H=518476627
H=812553592
H=1106630557
H=1400707522
H=1694784487
H=1988861452
H=2282938417
H=2577015382
H=2871092347
H=3165169312
H=3459246277
H=3753323242
H=4047400207
Press any key to continue
题目要求输出满足条件的最小的一个,没必要64位,如果说要是任意的素数的话,那就64位也是不够的,解出题即可。
M0605050215 2008-12-19
  • 打赏
  • 举报
回复
中国剩余定理!!
呼呼!
枚举,黑我哦,,,
同意一楼的,
有__int 64存储64位

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧