韩信点兵C语言实现的几种方法

问题描述:
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。

输入
输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7)。
输出
输出总人数的最小值(或报告无解,即输出No answer)。实例,输出:89

样例输入:
2 1 6
样例输出:
41
样例输入:
2 1 3
样例输出:
No Answer

分析:
从问题描述中可以看出,队尾人数等于士兵总人数除以每排士兵基数的余数。
解决思路:
选取一个整数,分别用选取的整数除以每个队形的每排士兵基数,得到每个队形的队尾人数,如计算出的所有队尾人数与题目中给出的队尾一致,若忽略最小值则找到了答案。
难点:
对于这个问题,已经找到了解决思路,但是如何选取整数十分重要,因为这将关系到我们程序的运行快慢。
方法一:
因为我们要找满足条件的最小值,所以我们采用循环的方式,从最小值10开始,然后加1,最大到最大值100,循环91次,如果找到便输出满足条件的最小值并结束循环。

 #include<stdio.h>
int main()
{int a, b, c;scanf("%d%d%d", &a,&b,&c);for(int i=10; i<101; i++){if(i%3 == a){if(i%5 == b){if(i%7 == c){printf("%d", i);return 0 ;}}}}  printf("No answer");  return 0;
}

方法二:
针对方法一,我们做出如下改进,每排士兵基数最大为7,此时队尾人数为c,所以士兵总人数为7i+c(i为正整数),因此我们的循环从7+c开始,每次加7,最大到91+c或98+c为止,循环只有13或14次,较方法一减少大量运行时间。如果找到便输出满足条件的最小值并结束循环。(为什么不选择每排士兵基数最小3?大家思考一下)

 #include<stdio.h>
int main()
{int a, b, c;scanf("%d%d%d", &a,&b,&c);for(int i=7+c; i<101; i=i+7){if(i%3 == a){if(i%5 == b){if(i%7 == c){printf("%d", i);return 0 ;}}}}  printf("No answer");  return 0;
}

方法三:
继续对方法二改进:
(1) 若c%3=a,设总人数为7i+c(i为正整数),(7i+c)%3=(7i%3+c%3)%3=(7i%3+c)%3=7i%3+b=b,则有7i%3=0,i=3n,所以总人数为21n+c。
此时,循环从21+c开始,每次加21,最大到84+c为止,循环只有4次,较方法二更加节省时间。
(2)若b%3=a,…,总人数为15n+b。
(3)若c%5=b,…,总人数为35n+c。
(4)若a%5=b,…,总人数为15n+a。
(5)若b%7=c,…,总人数为35n+b。
(6)若a%7=c,…,总人数为21n+a。

程序中只加入了(1)部分,其他部分也可加入,不过看起来程序特别长,但是执行效率在某些时候还是比较高效的。

#include<stdio.h>
int main()
{int a, b, c;scanf("%d%d%d", &a,&b,&c);if(c%3 == a){for(int i=21+c; i<101; i=i+21){if( i%5 == b){printf("%d", i);return 0 ;}}printf("No answer");  return 0;   }for(int i=7+c; i<101; i=i+7){if(i%3 == a){if(i%5 == b){if(i%7 == c){printf("%d", i);return 0 ;}}}}  printf("No answer");  return 0;
}

韩信点兵C语言实现的几种方法相关推荐

  1. c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程

    c语言计算机编程三种方法求解非线性方程 本 科 专 业 学 年 论 文题 目:非线性方程求解比较姓 名: 何 娟 专 业: 计算机科学技术系 班 级: 08 级本科(2)班 指 导 老 师: 刘 晓 ...

  2. c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程.doc

    c语言计算机编程三种方法求解非线性方程.doc 本 科 专 业 学 年 论 文题 目非线性方程求解比较姓 名 何 娟 专 业 计算机科学技术系 班 级 08 级本科(2)班 指 导 老 师 刘 晓 娜 ...

  3. ZCMU--5193: 韩信点兵(C语言)

    题目描述 韩信点兵,多多益善. 战前,萧何备军.韩信检阅,曰:"增1人?".萧何答:"甚好".韩信再曰:"使看齐?". 萧何再答" ...

  4. java语言复制数组的四种方法

    来源于牛客网的一道选择题: Java语言的下面几种数组复制方法中,哪个效率最高? A.for循环逐一复制 B.System.arraycopy C.System.copyof D.使用clone方法 ...

  5. MFC多语言实现的两种方法

    前不久由于工作需要,用新工具Passolo制作软件的英文版,顺便回顾了一下以前一直用的老方法--动态加载英文资源的DLL.今天有空整理了一下,与大家分享两种方法是如何实现软件多语言的. 方法一:动态加 ...

  6. 在编译前与后调教C语言binary的一种方法

    A.编译前的调教 在日常的C语言工程中,常常需要针对不同的平台.环境做不同类型的软件.最基本的,不同的操作系统(ISA),不同的device(协议.接口),不同的引擎(开发环境等),对应的实际代码完全 ...

  7. 定义c语言字符串的三种方法

    char str1[] = "HelloWorld"; 通过字符数组来定义字符串"HelloWorld",数组中每个存储单元存放一个字符 char *str2 ...

  8. C语言求素数两种方法

    素数定义:素数是指除了 1 和它本身以外,不能被任何 法一:判断一个整数 m 是否是素数,只需把m被2~m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数. 法二:把2~√n之间的每一个 ...

  9. C语言 最大公约数三种方法

    1.穷举法 输入 a,b两个数字,比如a>b,就从2到b,挨个试,如果是公约数就赋值给k,因为是从小到大的穷举数字,所以最后赋值给k的数字一定是最大的公约数. #include<stdio ...

最新文章

  1. html5调用系统声音1s响一次_HTML5声音录制/播放功能的实现代码
  2. 用T-SQL得到数据库的可视化结构
  3. 一个关于binder的debug技巧
  4. 数据库中char与varchar类型的区别 1
  5. 从HMM到MEMM再到CRF
  6. Netty 5用户指南
  7. 计算机系统-电路设计03-或门电路
  8. linux下的git 编辑器,vim - 如何让Git使用我选择的编辑器进行提交?
  9. 自定义配置节 Section
  10. 在注册表更改Program Files的位置
  11. Python实现共现语义网络
  12. delphi java aes_Delphi AES加密(转)
  13. 如何锁定win10笔记本键盘
  14. 康蒂尼药业再次冲刺港股:9个月营收4.4亿 龙磐创投是股东
  15. html透明颜色值,css中透明色的颜色值(rgb/rgba)
  16. 初中数学抽象教学的案例_初中数学教学案例及反思
  17. 七分钟学会 HTML 网页制作
  18. Error launching datagrip的if you already have a 64-bit JDK installed,define a JAVA_HOME variable in..
  19. linux停止正在执行脚本
  20. 维汉智能翻译android版最新版,维汉智能翻译词典最新版下载-维汉智能翻译下载2018下载 v3.0.6免费版_5577安卓网...

热门文章

  1. windows.edb文件
  2. 如何升级dart sdk以及choco不是内部或外部命令
  3. 使用HTML+CSS制作一个简单的网页
  4. 为什么主页是http://123.sogou.com/,改不了,我还以为中木马了
  5. HDU 5761 Rower Bo
  6. 关于echarts无数据时显示问题
  7. .env .env.development .env.production 配置说明
  8. PHP 7系列版本(7.0、7.1、7.2、7.3、7.4)新特性
  9. 使用MATLAB实现对信号的EMD分解
  10. 用C语言编辑一光年相当于多少米,天文学里一光年是多长的距离?