【C】韩信点兵

我姐给我出了一道题,让我去编一个韩信点兵的程序

学了循环结构后,总算编出来了

警告!有大量膜法

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5       int A,a;
 6       int B,b;
 7       int C,c;
 8       int D;
 9     printf("有一数,除以\n");
10
11     scanf("%d",&A);
12     printf("余\n");
13     scanf("%d",&a);
14
15     printf("除以\n");
16     scanf("%d",&B);
17     printf("余\n");
18     scanf("%d",&b);
19
20     printf("除以\n");
21     scanf("%d",&C);
22     printf("余\n");
23     scanf("%d",&c);
24
25
26         for(D=c; D%B != b; D += C);
27         for(; D%A != a; D += A*C);
28     printf("显然地,这个数是%d\n",D);
29     return 0;
30 }

为了加入中文,没有意义地写了这么长……

核心结构只是两个for语句

26         for(D=c; D%B != b; D += C);
27         for(; D%A != a; D += A*C);

大写的ABC是除数,小写的abc是D除以它们的余数

期间也因为中英文字符输入混乱而被迫一个双引号一个双引号的改正

也有其他的基本语法错误,慢慢地改正

最终得到了正确的结果

但是

问题:

举个例子

有一数

除8

余3

除5

余2

除7

余3

猜猜结果会是多少?

227?

显然程序将无限循环下去,直到D达到int的最大上限

让我用手工推一下

D=3

D%5 =3 不等于2

D=10

D%5 =0

不等于2

D=17

D%5=2

第一步循环完成

进入第二个for语句

D%8=1

不等于3

D =17+7*8

D = 73

D%8 =1

不等于3

D = 129

D%8 = 1

等等,怎么还是等于1?

我像个老人一样的坐在床边儿 沮丧了很久

无奈写了另一个版本

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 int main()
 5 {
 6         int A,a;
 7         int B,b;
 8         int C,c;
 9         int D;
10         puts("今有一数");
11
12         puts("除以");
13         scanf("%d",&A);
14         puts("余");
15         scanf("%d",&a);
16
17         puts("除以");
18         scanf("%d",&B);
19         puts("余");
20         scanf("%d",&b);
21
22         puts("除以");
23         scanf("%d",&C);
24         puts("余");
25         scanf("%d",&c);
26
27
28                 for( D=0 ; D < A*B*C ; ++D )
29                 {
30                   if( D%A == a && D%B == b && D%C == c)
31                         {
32                         printf("显然地,这个数是%d", D );
33                         break ;
34                         }
35                 }
36
37
38     return 0;
39 }

采用穷举果然比较稳妥,虽然比较慢

过了很久

我重新分析了一下第一个方法

显然第一个for是要求一数模B余b,模C余c

然后第二个for是求该数在模B与C有b与c的同时模A余a

但是

27      for(; D%A != a; D += A*C);

为什么是 D+=A*C?

……………………

居然败在了一个低级错误上

改为 D+= B*C后很简单就排除了这个bug

………………

时间: 2024-10-25 15:45:19

【C】韩信点兵的相关文章

cogs——1786. 韩信点兵

1786. 韩信点兵 ★★★   输入文件:HanXin.in   输出文件:HanXin.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 韩信是中国军事思想“谋战”派代表人物,被后人奉为“兵仙”.“战神”.“王侯将相”韩信一人全任.“国士无双”.“功高无二,略不世出”是楚汉之时人们对其的评价.作为统帅,他率军出陈仓.定三秦.擒魏.破代.灭赵.降燕.伐齐,直至垓下全歼楚军,无一败绩,天下莫敢与之相争. 相传,韩信带兵打仗时,从不直接清点军队人数.有一次,韩信带1

数学上的一些小技巧韩信点兵的问题

对于韩信点兵的问题,一个数n:n%3=t1;n%5=t2;n%7=t3;如果现在告诉你这三个余数,问你怎么求出来n.只要求最小的一个n就行解法如下: 一.首先对于3来说,因为70能被5和7整除,并且对三取余等于1: 二.对于5来说,因为21能被3和7整除,并且对于5取余等于1 三.对于7来说,因为15能被3和5整除,并且对于7取余等于1. 四.则就是将70*t1+21*t2+15*t3;如果得到的数比105大,那么将这个数减去105:直到小于105: 原理就是: 70=3*n+1;所以70*t1

习题 2-1 位数 2-2 水仙花数 2-3 韩信点兵 2-4倒三角形 2-6 调和级数 2-7近似计算 2-8 子序列的和

2-1 位数 #include<stdio.h> #include<math.h> int main () { int n; for (n=100; n<=999; n++) { if(n == pow(n/100,3) + pow(n/10%10,3) + pow(n%10,3) ) printf("%d\n",n); } system("PAUSE"); return EXIT_SUCCESS; } 2-2 水仙花数 #includ

韩信点兵(中国剩余定理)

中国剩余定理是数论中的一个关于一元线性同余方程组的定理,说明了一元线性同余方程组有解的准则以及求解方法.又称为孙子定理,"韩信点兵""求一术""鬼谷算""隔墙算""剪管术""秦王暗点兵""物不知数"等名称. 例如:物不知数原文: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 宋朝数学家秦九韶对"物不知数"问题作出了完整系统的解

南阳理工--韩信点兵

#include<stdio.h>int main(){  int a,b,c;  int x;  scanf("%d%d%d",&a,&b,&c);  for(x=10;x<=100;x++)  {   if(x%3==a&&x%5==b&&x%7==c)   {    printf("%d\n",x);    break;   }  }  if(x>100)  {   printf(

ACM试题 - 韩信点兵

1. ACM试题题源:http://acm.nyist.net/JudgeOnline/problem.php?pid=34 关于韩信点兵:淮安民间传说着一则故事——“韩信点兵”,其次有成语“韩信点兵,多多益善”.韩信带1500名兵士打仗,战死四五百人,站3人一排,多出2人:站5人一排,多出4人:站7人一排,多出6人.韩信马上说出人数:1049. 2. 解题思路 思路一:可以先求出三组数,这三组数分别是分别用3,5,7除总人数在规定范围内所有的可能数值,然后求得这三组数中相同的那个数即可. 例如

4.韩信点兵:有一个数,用3除余2;用5除余3;用7除余2,求满足条件的最小数

(1)用IF嵌套: #include <iostream>using namespace std; int main(){    int i=100;    int minNum;    while(i>0)    {        if(i%3==2)        {            if(i%5==3)            {                if(i%7==2)                {                    minNum=i;   

韩信点兵-中国剩余定理(练习)

http://acm.nyist.net/JudgeOnline/problem.php?pid=34提交地址 韩信点兵-中国剩余定理. 题目可以用枚举很简单的做出来,在这里写是为了运用一下刚刚学习的中国剩余定理. 以前写过中国剩余定理的博客在这就不多说了. 如果下面的字母看不懂请看我的另一篇博客http://blog.csdn.net/u010123208/article/details/24314627 说一说思路吧. 1.首先我们要用数组存储我们的要的除数,和余数.我们用m[]来存储,余数

COGS 1786. 韩信点兵

★★★   输入文件:HanXin.in   输出文件:HanXin.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 韩信是中国军事思想“谋战”派代表人物,被后人奉为“兵仙”.“战神”.“王侯将相”韩信一人全任.“国士无双”.“功高无二,略不世出”是楚汉之时人们对其的评价.作为统帅,他率军出陈仓.定三秦.擒魏.破代.灭赵.降燕.伐齐,直至垓下全歼楚军,无一败绩,天下莫敢与之相争. 相传,韩信带兵打仗时,从不直接清点军队人数.有一次,韩信带1500名兵士打仗,战死四