辗转相除法应用之倒C语言实现
倒水
有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。 可以进行的操作是: 把一个容器灌满; 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸); 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。 问是否能够通过有限次操作,使得水缸最后恰好有C升水。
输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000 输出:0或1,表示能否达到要求。
函数头部: c语言:1表示可以,0表示不可以 int can(int a,int b,int c);
c++语言: true表示可以,false表示不可以 bool can(int a,int b,int c);
java语言:true表示可以,false表示不可以 public class Main {public static boolean can(int a,int b,int c); }
分析
经典的倒水问题,有不少公司也出了类似的面试题目,有的以选择题形式出现,也有编程题形式出现的,下面做简要的分析:
对题目做简要的处理分析后,C升水是可以分多次倒入的,假设A > B,那么每次可以倒的水的量为A , B , (A + B) ,( A - B)升水,设置4个因子,分别为x1 , x2, x3, x4 , (x1 , x2, x3, x4 属于整数),如果可以使得水缸最后恰好有C升水,那么必然存在整数x1 , x2, x3, x4,使得
Ax1 + Bx2, + (A + B)x3 + (A - B)x4 = C 等式成立;
对等式做一定的变换,得到公式
(x1 + x3 + x4)A + (x2 + x3 - x4)B = C ; --( 1-1 )
设 x = x1 + x3 + x4 , y = x2 + x3 - x4 , x, y 均为整数;最终得到公式
xA + yB = C ; --( 1-2 )
x1 , x2, x3, x4 可以假设为正整数,用几个for循环可以实现,但是时间复杂度太大,为O(N4),题目中给的范围是0 < A , B, C <= 1000000000;整数在十亿范围,显然运行时间肯定会超过 3s ,不符合要求,那有没有更加合适的方法呢,在算法的书里面,有一个算法,与公式( 1-2 ) 不谋而合,是扩展的欧几里德算法,算法描述:
定理:
#include "stdio.h" int can(int a,int b,int c){int n = a%b;while(n!=0){a = b;b = n;n = a%b;}if (c%b == 0)return 1;else return 0; } int main(){int a,b,c;printf("输入a,b,c\n");scanf("%d%d%d",&a,&b,&c);if ((can(a,b,c))){printf("yes");} else {printf("no");} }
感谢大卫david的倒水博文.本文是转发他的文章
转载于:https://www.cnblogs.com/kaikai7/p/3301913.html
辗转相除法应用之倒C语言实现相关推荐
- c语言l利用辗转相除法约分,如何用c语言求最大公约数和最小公倍数
如何用c语言求最大公约数和最小公倍数 输入两个正整数m和n, 求其最大公约数和最小公倍数. <1> 用辗转相除法求最大公约数 算法描述: m对n求余为a, 若a不等于0 则 m 否则 n ...
- PTA练习:谁先倒.(C语言)
划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒.两人同赢或两人同输 ...
- c语言有参有类最小公倍数,C语言求最大公约数和最小公倍数算法
C 语言求最大公约数和最小公倍数算法 C 语言求最大公约数和最小公倍数可以说是C 语言编程学习中一个重点和难点,它常常作为计算机专业学生参加各种考试必须要把握的内容.其算法方面除常用的辗转相除法外.还 ...
- c语言怎样求最大公约数,c语言求最大公约数
求差判定法. 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60 ...
- 代码实现 —— 多项式的最大公因式(线性代数)
系列文章目录 文章目录 系列文章目录 前言 一.最大公因式 1.定义: 2.说明: 二.辗转相除法 1.带余除法 2.引理 3.辗转相除法求最大公因数 4.辗转相除法求最小公倍数 三.C语言实现 1. ...
- Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理、倒排索、建立查找树、处理Hash冲突、Hash查找)
Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理.倒排索.建立查找树.处理Hash冲突.Hash查找) 目录 一.SimHash算法 1.SimHash算法五个步骤 2. ...
- c语言乘法口诀倒三角,乘法口诀表,C语言实现
▲C语言实现乘法口诀表的输出 ①正三角输出#include int main() { int i, j = 0; for (i = 1; i <= 9; i++) { for (j = 1; j ...
- 【C语言练习】求两个数m和n的最大公约数(辗转相除法)
求两个数m和n的最大公约数 一.编程思路 1.首先,题目里是两个数,我们自然而然要想到定义两个变量: 2.其次,我们的目的是寻找最大公约数,所以要搞清楚其概念:两个或多个整数共有约数中最大的一个 3. ...
- C语言试题三十一之判断字符串是否为回文?若是则函数返回1,主函数中输出yes,否则返回0,主函数中输出no。回文是指顺读和倒读都是一样的字符串。
1. 题目 请编写函数function,该函数的功能是:判断字符串是否为回文?若是则函数返回1,主函数中输出yes,否则返回0,主函数中输出no.回文是指顺读和倒读都是一样的字符串. 2 .温馨提示 ...
最新文章
- python将string转换为json_python -- 将string转换成dict的方法
- HTML5全屏API
- 写一个程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示。(单词之间用空格隔开,如“Hello World My First Unit Test”);...
- 数学--数论---P4718 Pollard-Rho算法 大数分解
- 在您的Maven-Fu包中增加了一些东西
- rsync 一条命令实现远程文件传输
- linux 32bit 改为64bit问题
- vue路由1:基本使用
- linux /proc/stat 计算线程cpu,Linux下用/proc/stat文件来计算cpu的利用率(附源码)
- 微软高性能网络编程示例程序
- 我,开了五年快递站,现在还没回本
- Matlab中持久变量(persistent)在Python中的理解
- 啸叫抑制(howling suppression)
- 关于用EAC抓轨的测试 (转载)
- lol服务器不稳定领皮肤,LOL免费领“源代码娜美”皮肤 官方致歉游戏卡顿问题...
- osgEarth示例分析——osgearth_elevation
- 每日写题分享--包含min函数的栈/双栈实现
- 纯css实现翻书效果
- Java基础语法的思维导图
- Safari 与 Edge:哪种浏览器更适合 Mac
热门文章
- 通向财务自由之路05_选择一个有效的理念
- python安装包的方法与图解_Python包的几种安装方法,方式
- web报表工具FineReport使用中遇到的常见报错及解决办法(一)
- 乌邦图怎么装php,Ubuntu如何安装php7?
- linux 日志 转存,如何记录linux终端下的操作日志(转)
- STL常用函数总结-map
- pytorch学习笔记(三十七):Adam
- R语言中,保留含有特定字符的元素
- hihocoder第226周:打表找规律
- Uncaught Error: Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)