c语言枚举法(穷举法)
c语言枚举法
c语言枚举法枚举法是数学和计算机科学中非常重要的一种算法思想,它可以用来解决一些复杂的问题。
在计算机程序设计中,枚举法是一种通过穷举所有可能的情况来解决问题的方法。
它可以帮助程序员在不知道答案的情况下,通过尝试所有可能的值来找到正确的解决方案。
枚举法的基本思想是将问题的所有可能情况一一列举出来,然后逐个进行判断。
这个过程可以通过循环来实现,遍历所有可能的情况,找到最优解或者满足特定条件的解。
在程序设计中,枚举法通常用来解决一些离散化的问题,比如在一个数组中查找一个特定的元素,或者在一个字符串中查找一个子串。
枚举法的优点是简单易懂,代码实现比较容易。
因为它是一种逐一尝试的方法,所以可以保证找到最优解或者满足特定条件的解。
但是,枚举法的缺点也很明显,就是时间复杂度较高。
当问题的解空间很大时,枚举法需要尝试的次数也会很多,从而导致程序运行时间过长。
在实际的程序设计中,枚举法通常会和其他算法思想结合起来使用,比如贪心算法、分治法、动态规划等。
这样可以充分发挥各种算法的优点,解决更加复杂的问题。
下面通过一个实例来介绍枚举法的应用。
假设有一个长度为n的数组A,其中所有元素都是非负整数。
现在需要找出所有的子数组,使得它们的和等于一个给定的正整数k。
如果存在多个解,需要输出所有的解。
对于这个问题,可以使用枚举法来解决。
具体的方法是遍历所有可能的子数组,计算它们的和,然后判断是否等于k。
如果等于k,则将该子数组输出。
下面是一个使用枚举法解决这个问题的代码示例:```cint n = sizeof(A)/sizeof(int);int k = 10;for(int i = 0; i < n; i++) {for(int j = i; j < n; j++) {int sum = 0;for(int l = i; l <= j; l++) {sum += A[l];}if(sum == k) {printf("Subarray found: [%d, %d]\n", i, j);}}}```在这个代码中,首先定义了一个数组A和一个正整数k,用来表示问题的输入。
C语言实现求最大公约数的三种方法
C语⾔实现求最⼤公约数的三种⽅法⽬录题⽬描述问题分析代码实现⽅法⼀:穷举法⽅法⼆:辗转相除法⽅法三:更相减损法题⽬描述求任意两个正整数的最⼤公约数问题分析最⼤公因数,也称最⼤公约数、最⼤公因⼦,指两个或多个整数共有约数中最⼤的⼀个。
a,b的最⼤公约数记为(a,b),同样的,a,b,c的最⼤公约数记为(a,b,c),多个整数的最⼤公约数也有同样的记号。
求最⼤公约数有多种⽅法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。
与最⼤公约数相对应的概念是最⼩公倍数,a,b的最⼩公倍数记为[a,b]。
——百度百科最⼤公因数的求法有不少,本⽂我将采⽤穷举法、辗转相除法、更相减损法三种⽅法,求两个正整数的最⼤公约数(最⼤公因数)。
代码实现⽅法⼀:穷举法穷举法(列举法),是最简单最直观的⼀种⽅法。
具体步骤为:先求出两个数的最⼩值min(最⼤公约数⼀定⼩于等于两个数的最⼩值),接着从最⼩值min递减遍历(循环结束条件为i > 0),如果遇到⼀个数同时为这两个整数的因数,则使⽤break退出遍历(退出循环),这时的遍历值i即为两个正整数的最⼤公约数。
#include <stdio.h>/*** @brief 获取两个正整数的最⼤公因数(穷举法)* @param num1 第⼀个正整数* @param num2 第⼆个正整数* @return 最⼤公因数*/int Get_Max_Comm_Divisor(int num1, int num2){int i = 0;//获取两个整数的最⼩值int min = num1 < num2 ? num1 : num2;//从两个数的最⼩值开始递减遍历for(i = min; i > 0; i--){//i为num1和num2的公倍数if(num1 % i == 0 && num2 % i == 0)break;}return i;}int main(){int num1 = 0, num2 = 0;puts("请输⼊两个正整数.");scanf("%d%d", &num1, &num2);printf("最⼤公约数为%d.\n", Get_Max_Comm_Divisor(num1, num2));运⾏结果⽅法⼆:辗转相除法辗转相除法⼜称欧⼏⾥得算法,是指⽤于计算两个⾮负整数a,b的最⼤公约数。
c语言枚举类型enum用法
c语言枚举类型enum用法枚举类型enum是C语言中的一种基本数据类型,表示的是一组固定的常量值的集合,又称为枚举集。
它是一种用于定义命名常量的数据类型,可以为不同的变量赋予不同的名称以表示不同的常量值的集合。
一、枚举类型的定义枚举类型是使用关键字enumC语言中定义的数据类型,它用来定义一组字面量常量,每一个常量都有一个整数值,但通常不需要指定,编译器会自动赋值,也可以自行指定每个常量的值。
语法格式如下: enum举名{常量1[=数常量],常量2[=数常量],…常量n[=数常量]}举变量;其中,枚举名是枚举变量的名称,用来为枚举类型起一个有意义的名字;常量1和常量2是枚举类型中的成员,它们都可以给出整数常量;枚举变量代表定义的枚举变量,它是枚举类型的实例。
二、枚举类型的用法1.举类型可以用来简单地表示一系列的整数值,能够把程序中使用的整数常量通过定义有意义的名称来表示,从而有助于让程序的逻辑更加清晰。
2.举类型是C语言中的一种类型,它的变量的值只能是指定的一组枚举值中的一个,由此可以定义简单的逻辑控制语句,它可以用来表示跨越变量边界的逻辑控制,以及一些计算机系统中经常出现的状态量。
3.C语言中,枚举类型可以用作函数的参数,可以用来表示参数的不同状态,用来表示函数可能出现的不同情况。
4.举类型也可以用作结构体成员,可以用来表示不同变量之间的逻辑关系,以及表示多种可能的状态。
三、枚举类型的优缺点1.举类型的优点:它是一种简单的数据类型,可以把程序中使用的整数常量用有意义的名称来表示,从而使程序更易于阅读和理解;它可以用作函数的参数,可以表达不同变量之间的关系,可以表示多种可能的状态。
2.举类型的缺点:它的变量的值只能是指定的一组枚举值中的一个,不能表达复杂的数据类型,因此在一些复杂的程序中,不适用这种数据类型。
综上所述,枚举类型enum是C语言中的一种基本数据类型,用来定义一组字面量常量,用来表示不同变量之间的关系,可以用作函数的参数,可以帮助程序变得更加清晰和易于理解。
c语言枚举法
c语言枚举法C语言枚举法引言:C语言是一种广泛应用于软件开发的编程语言,它拥有强大的表达能力和灵活的语法结构。
在C语言中,枚举法是一种常见的解决问题的方法之一。
本文将介绍C语言中的枚举法及其应用。
一、枚举法的概念及原理枚举法是一种通过穷举所有可能情况来解决问题的方法。
它基于以下原理:对于一个问题,我们可以列举出所有可能的解,并逐一验证这些解是否满足问题的要求。
通过枚举所有可能的解,我们可以找到问题的最优解或满足特定条件的解。
二、枚举法的应用1. 寻找最值枚举法可以用于寻找一组数据中的最大值或最小值。
我们可以通过遍历数据,依次比较每个元素与当前最值的大小关系,从而得到最终的最值。
2. 解决排列组合问题排列组合问题是指从给定的元素集合中选择若干元素进行排列或组合的问题。
枚举法可以通过穷举所有可能的排列或组合,来解决这类问题。
3. 查找特定条件的解有些问题需要在一定的条件下寻找满足特定要求的解。
枚举法可以通过穷举所有可能的解,逐一验证是否满足条件,从而找到满足要求的解。
三、枚举法的优缺点1. 优点枚举法的优点是简单、直观。
它不需要复杂的数学推导或复杂的算法,适用于解决一些简单的问题。
2. 缺点枚举法的缺点是效率低下。
当问题的解空间非常大时,枚举法需要遍历大量的可能解,耗费时间较长。
四、枚举法的代码实现下面以一个具体的问题为例,演示枚举法的代码实现。
问题描述:给定一个整数数组,找出其中两个元素的和为给定目标值的所有组合。
```c#include <stdio.h>void findCombinations(int arr[], int n, int target) {for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {if (arr[i] + arr[j] == target) {printf("%d + %d = %d\n", arr[i], arr[j], target);}}}}int main() {int arr[] = {2, 4, 6, 8, 10};int n = sizeof(arr) / sizeof(arr[0]);int target = 12;findCombinations(arr, n, target);return 0;}```以上代码通过嵌套循环遍历数组中所有可能的组合,并判断其和是否等于目标值。
c语言穷举法傻瓜教程
穷举法1.密码箱问题#include<stdio.h>main(){int i,key;printf("请设定旅行箱的密码(000-999):"); scanf("%d",&key);printf("\n你的旅行箱密码是:");for(i=0;i<=999;i++)if(i==key)if(i<10)printf("%d\n",i);else if(i<100)printf("%d\n",i);else printf("%d\n",i);}2.百钱买百鸡问题#include<stdio.h>main(){int i , j , k;/*准备输出格式*/printf("\t公鸡\t母鸡\t小鸡\n");for(i=0;i<=20;i++)for(j=0;j<=33;j++){k=100-i-j;if(k%3==0 && i*5+j*3+k/3==100) printf("\t%d\t%d\t%d\n",i ,j ,k); }}例 2 :36 块砖,36 人搬。
男搬 4 ,女搬 3 ,两个小儿抬一砖。
要求一次全搬完。
问需男、女、小儿各若干(必须都有)?请同学们先分析第一步:问题所涉及的情况;analysis:都男的搬,需9人;都女的搬,需12人,都小孩搬,需72人;小孩书需要是2的整数倍;解:#include<stdio.h>main(){int i,j,k;for(i=0;i<=9;i++)for(j=0;j<=12;j++){k=36-i-j;//消去参数需放在最后一个for循环里面if(k%2==0&&i*4+j*3+k*0.5==36)printf("%d\t%d\t%d\n",i,j,k);}作业:换零钞问题:一张100元,换成20,10,5,1面值的零钞,每种至少一张,共有哪些换法,总计多少种换法?都换20:5张;----i都换10:10张;----j都换5:20张;----k都换1:100张----tt=100-i-j-k;解:#include<stdio.h>main()int i,j,k,t;for(i=1;i<=5;i++)for(j=1;j<=10;j++)for(k=1;k<=20;k++){t=100-i*20-j*10-k*5;if(i*20+j*10+k*5+t==100&&t>0)printf("%d\t%d\t%d\t%d\n",i,j,k,t);}}2.从1到100的自然数中,每次取出两个数,要使它们的和大于100,共有哪些取法,总计多少种取法?#include<stdio.h>main(){static int count=0;int i,j;for(i=1;i<=100;i++)for(j=1;j<=100;j++){if((i+j)>100&&j!=i){count++;printf("i=%d\tj=%d\n",i,j);}}printf("循环次数为%d\n",count);}。
C++丨常见的四种求最大公约数方法!赶紧收藏!
C++⼁常见的四种求最⼤公约数⽅法!赶紧收藏!为了更好的了解算法的概念,今天会分享⼀些C++求最⼤公约数⼏种常见的算法。
第⼀种:穷举法之⼀穷举法,也叫枚举法,求最⼤公约数时从两者中较⼩的数开始,由⼤到⼩列举,直到找到第⼀个公约数为⽌。
解释:拿其中⼀个数出来,⽤⼀个临时变量(tem)保存,每次都把那两个数除以这个临时变量。
如果能除断,直接返回tem;如果不能除断,tem- -,直到都能除断,再返回tem。
tem就是它们的最⼤公约数。
#include <iostream>using namespace std;int CommFactor1(int m, int n); //函数的声明int main(){int a, b;cin >> a >> b;cout << "这两个数的最⼤公约数为:" << CommFactor1(a,b)<< endl;return 0;}int CommFactor1(int m,int n){int tem;for (tem = m;; tem--){if (m % tem == 0 && n % tem == 0){break;}}return tem;}第⼆种:穷举法之⼆解释:求出两数的所有公因⼦,再把公因⼦累乘得到最⼤公约数。
#include <iostream>using namespace std;int CommFactor2(int m, int n); //函数的声明int main(){int a, b;cin >> a >> b;cout << "这两个数的最⼤公约数为:" << CommFactor2(a,b)<< endl;return 0;}int CommFactor2(int m,int n){int i;int factor = 1;for (i=2;i<=m&&i<<n;i++){while(m % i == 0 && n % i == 0) //这⾥不能⽤if语句,因为可能会有重复的公因⼦{factor = factor * i;m = m / i;n = n / i;}}return factor;}第三种:辗转相除法辗转相除法,⼜称欧⼏⾥得算法。
c语言枚举法
c语言枚举法C语言枚举法枚举法是一种常用的解决问题的方法,也是C语言中常用的一种算法。
它通过穷举所有可能的情况来求解问题,从而找到问题的解决方案。
本文将介绍枚举法的基本原理和应用场景,并通过具体的例子来说明其使用方法和注意事项。
一、枚举法的原理枚举法的基本原理是通过遍历所有可能的情况来求解问题。
它适用于问题的解空间较小,可列举出所有可能的情况的情况。
枚举法的步骤如下:1. 确定问题的解空间:即确定问题的解可能取值的范围,通常是通过问题的约束条件来确定。
2. 遍历解空间:通过循环语句遍历解空间中的所有可能情况。
3. 判断解的有效性:对于每个可能的解,判断其是否满足问题的要求。
4. 输出满足要求的解:将满足要求的解输出,即得到问题的解决方案。
二、枚举法的应用场景枚举法适用于以下场景:1. 查找问题的解:例如在一个整数数组中查找某个特定的元素,可以通过枚举数组中的所有元素来找到目标元素的位置。
2. 判断问题的性质:例如判断一个数是否为素数,可以通过枚举该数的所有可能因子来判断。
3. 优化问题求解:例如在一组数字中找到最大或最小值,可以通过枚举所有数字并比较得到最终结果。
三、枚举法的例子下面通过几个具体的例子来说明枚举法的使用方法和注意事项。
例子1:在一个整数数组中查找指定的元素。
假设有一个整数数组arr,我们要查找其中是否存在一个数target。
可以通过枚举数组中的所有元素,逐个与target进行比较,如果找到相等的元素,则说明目标元素存在于数组中。
例子2:判断一个数是否为素数。
素数是指只能被1和自身整除的正整数。
我们可以通过枚举该数的所有可能因子,从2到sqrt(n)(其中n为待判断的数),检查是否存在能整除n的因子。
如果存在,则说明n不是素数;否则,n是素数。
例子3:在一组数字中找到最大或最小值。
假设有一组数字arr,我们要找到其中的最大值。
可以通过枚举数组中的所有数字,逐个与当前最大值进行比较,如果找到比当前最大值更大的数字,则更新最大值。
c语言枚举类型enum用法 嵌入式 -回复
c语言枚举类型enum用法嵌入式-回复枚举类型(enum)是C语言中一种用于定义一组具有离散取值的常量的方法。
它是一种数据类型,可以作为变量的类型使用。
在嵌入式系统开发中,枚举类型广泛应用于标记和处理设备状态、事件处理等方面。
本文将从基本概念、声明和初始化、枚举常量、枚举变量的使用等方面,详细介绍C语言枚举类型的使用。
# 1. 基本概念枚举类型是一种由用户自定义的类型,它主要用于定义一组常量。
每个常量都有一个相关联的标识符,并且只能取枚举中定义的值之一。
枚举类型使用关键词enum进行声明,语法格式如下:enum 枚举类型名{枚举常量1,枚举常量2,...};其中,枚举类型名为自定义的类型名称,可以根据实际需求进行命名。
枚举常量即为该类型可以取的值,多个枚举常量之间用逗号分隔。
# 2. 声明和初始化声明枚举类型变量的语法格式如下:enum 枚举类型名变量名;在声明时,可以选择指定一个枚举常量作为初始值,也可以不提供初始值。
例如:enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };enum Weekday today = Tuesday;在上述例子中,我们定义了一个名为Weekday的枚举类型,其中包含了一周七天的枚举常量。
然后,我们声明了一个名为today的枚举类型变量,并将其初始值设为Tuesday。
# 3. 枚举常量枚举常量是枚举类型的取值之一。
每个枚举常量对应一个整数值,该值从0开始,依次递增。
在声明枚举类型时,如果没有特别指定枚举常量的值,默认为从0开始递增。
例如:enum Season { Spring, Summer, Autumn, Winter };在上述例子中,我们定义了一个名为Season的枚举类型,其中包含了四个枚举常量。
由于没有为枚举常量指定值,Spring的值为0,Summer 的值为1,Autumn的值为2,Winter的值为3。
C语言枚举法
解题思路
最简单的方法,把1到1000000所有的数 的产生的d(n),都算出来,所有没被算出 来的数就是我们所需要的答案了。
int b[1000001]; for(i = 1; i <= 1000000; i++) { x = i, temp = i; while(temp != 0) { x += temp%10; temp /= 10; } if(x <= 1000000) b[x] =1; }
用枚举法解题的最大的缺点是运算量比较大, 解题效率不高,如果枚举范围太大(一般以不 超过两百万次为限),在时间上就难以承受。 但枚举算法的思路简单,程序编写和调试方便, 比赛时也容易想到,在竞赛中,时间是有限的, 我们竞赛的最终目标就是求出问题解,因此, 如果题目的规模不是很大,在规定的时间与空 间限制内能够求出解,那么我们最好是采用枚 举法,而不需太在意是否还有更快的算法,这 样可以使你有更多的时间去解答其他难题。
解题方案2:
第二种思路。要使得N盏灯开和关交替出现, 实际上只有两种可能:奇数位置上的灯是开着 的,或者偶数位置上的灯是开着的。只要分别 计算从N盏灯的初始状态出发,切换到这两种 状态所需要切换灯的数目,取较小者即可。例 如样例输入中的第1个测试数据对应的初始状 态如图所示,将这9盏灯切换到奇数位置上的 灯是开着的,需要切换6盏灯;切换到偶数位 置上的灯是开着的,需要切换3盏灯;因此至 少需要切换3盏灯。
小技巧: 很多编译器的主函数里 面是不支持开大数组。 我们可以通过定义全局 变量来解决这个问题。
可以优化吗??? 可以优化吗???
优化 int b[1000001]; for(i = 1; i < =1000000; i++) { x = i, temp = i; while(temp != 0) { x += temp%10; if (x>1000000) break; temp /= 10; } if(x <= 1000000) b[x] =1; }
枚举法
枚举法,常常称之为穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。
能使命题成立者,即为问题的解。
采用枚举算法解题的基本思路:(1)确定枚举对象、枚举范围和判定条件;(2)一一枚举可能的解,验证是否是问题的解下面我们就从枚举算法的的优化、枚举对象的选择以及判定条件的确定,这三个方面来探讨如何用枚举法解题。
枚举算法应用例1:百钱买百鸡问题:有一个人有一百块钱,打算买一百只鸡。
到市场一看,大鸡三块钱一只,小鸡一块钱三只,不大不小的鸡两块钱一只。
现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡?算法分析:此题很显然是用枚举法,我们以三种鸡的个数为枚举对象(分别设为x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件,穷举各种鸡的个数。
下面是解这个百鸡问题的程序var x,y,z:integer;beginfor x:=0 to 100 dofor y:=0 to 100 dofor z:=0 to 100 do{枚举所有可能的解}if (x+y+z=100)and(x*3+y*2+z div 3=100)and(z mod 3=0)then writeln('x=',x,'y=',y,'z=',z); {验证可能的解,并输出符合题目要求的解} end.上面的条件还有优化的空间,三种鸡的和是固定的,我们只要枚举二种鸡(x,y),第三种鸡就可以根据约束条件求得(z=100-x-y),这样就缩小了枚举范围,请看下面的程序:var x,y,z:integer;beginfor x:=0 to 100 dofor y:=0 to 100-x dobeginz:=100-x-y;if (x*3+y*2+z div 3=100)and(z mod 3=0)thenwriteln('x=',x,'y=',y,'z=',z);end;end.未经优化的程序循环了1013次,时间复杂度为O(n3);优化后的程序只循环了(102*101/2)次,时间复杂度为O(n2)。
穷举法(枚举法)
一、穷举法(枚举法)列出问题的全部可能解,然后找到最佳解例:设有A、B、C、D四个数都在1~16范围内。
要求打印出四个数都不相同时,其和为34的所有值。
•算法分析:最直接的想法是设置A、B、C、D四个变量,都从1至16循环。
但这需要164次循环,而且循环中还必须判断A、B、C、D四数有所重复的情况。
我们可以加上一定的限制条件A≠B≠C≠D,设A<B<C<D,这样可以设A的初值为1,B的初值为A+1,C的初值为B+1,D的初值为C+1。
每一个循环的终值(可能的最大数)我们也可以计算出来。
A + A+1 + A+2 + A+3 = 34,故A=7;1 + B + B+1 + B+2 = 34,故B=10;1 +2 + C + C+1 = 34,故C=15;D=C+1,故D=16。
函数如下:void fournums() {int a, b, c, d ;for (a = 1; a<=7; a++)for (b = a+1; b<=10; b++)for (c = b+1; c<=15; c++)for (d = c+1; a<=16; d++)if (a+b+c+d == 34)cout << “A=”<< a << “B=”<< b << “C=”<< c << “D=”<< d <<”\n”; }二、贪心法当一个问题的状态空间很大时,穷举法计算量可能会太大。
当人们面对一个问题时,可能会采取目前看来最接近解状态的选择方案。
•有时运用最直接的方法,可能会得到很好的效果。
•《C程序设计选讲》背包问题•Huffman树贪心法一般原则贪心法把构造可行解的工作分阶段来完成。
在各个阶段,选择那些在某些意义下是局部最优的方案,期望各阶段的局部最优的选择带来整体最优。
c语言枚举法实例
c语言枚举法实例枚举法是一种常用的算法思想,可以用来解决各种问题。
它通过穷举所有可能的情况,找出符合条件的解。
本文将以C语言为例,介绍枚举法的原理和应用。
一、枚举法的原理枚举法的原理很简单,就是将所有可能的情况都列举出来进行遍历,然后判断是否满足给定的条件。
具体步骤如下:1. 确定枚举的对象:首先要明确需要枚举的对象是什么,可以是一组数字、字符、字符串等。
2. 确定枚举的范围:确定对象的取值范围,即需要遍历的区间或集合。
3. 枚举所有可能的情况:使用循环结构遍历对象的所有取值,将每一种情况都考虑到。
4. 判断条件是否满足:对于每一种情况,判断是否满足给定的条件。
5. 输出符合条件的解:将满足条件的情况输出或进行其他操作。
二、枚举法的应用举例1. 查找最大值和最小值:给定一组数字,通过枚举法可以遍历所有可能的情况,找出其中的最大值和最小值。
2. 判断素数:给定一个数,通过枚举法可以遍历所有可能的因子,判断是否存在除1和本身以外的因子,从而确定是否为素数。
3. 搜索目标值:给定一个有序数组,通过枚举法可以遍历所有可能的索引,判断是否存在目标值。
4. 求解方程:给定一个方程,通过枚举法可以遍历所有可能的解,从而求得方程的解。
5. 组合问题:给定一组数字或字符,通过枚举法可以遍历所有可能的组合情况,从而解决排列组合相关的问题。
三、枚举法的实例演示下面以查找最大值和最小值为例,演示枚举法的应用。
```c#include <stdio.h>int main() {int nums[] = {7, 2, 9, 4, 5};int n = sizeof(nums) / sizeof(nums[0]);int max = nums[0];int min = nums[0];for (int i = 1; i < n; i++) {if (nums[i] > max) {max = nums[i];}if (nums[i] < min) {min = nums[i];}}printf("最大值:%d\n", max);printf("最小值:%d\n", min);return 0;}```在上面的代码中,我们定义了一个包含一组数字的数组nums,然后使用循环遍历数组中的每个元素。
c语言求两个数的最大公因数(穷举法,欧几里得算法,递归)
c语⾔求两个数的最⼤公因数(穷举法,欧⼏⾥得算法,递归)/*主函数Gcd为求公因数的函数输⼊为负时返回-1*/int main(){ int a, b; printf("Input a,b:"); scanf("%d,%d",&a,&b); if (a < 0 || b < 0) printf("Input number should be positive!\n"); else printf("Greatest Common Divisor of %d and %d is %d\n",a,b,Gcd(a,b)); return 0;}/*穷举法⼀(欧⼏⾥得)*/int Gcd(int a,int b){ int i,t; if(a<=0 || b<=0) return -1; t=a<b ? a : b; for(i=t;i>0;i--) { if(a%i==0 && b%i==0)return i; } return 1;}/*穷举法⼆*/int Gcd(int a,int b){ int r; if(a<=0 || b<=0) return -1; do { r=a%b; a=b; b=r; }while(r!=0); return a;}/*递归⼀*/int Gcd(int a,int b){ if(a<=0 || b<=0) return -1; if(a%b==0) return b; else return Gcd(b,a%b);}/*递归⼆是根据公因数的如下性质:根据最⼤公约数的如下3条性质,采⽤递归法编写计算最⼤公约数的函数Gcd(),在主函数中调⽤该函数计算并输出从键盘任意输⼊的两正整数的最⼤公约数。
性质1 如果a>b,则a和b与a-b和b的最⼤公约数相同,即Gcd(a, b) = Gcd(a-b, b)性质2 如果b>a,则a和b与a和b-a的最⼤公约数相同,即Gcd(a, b) = Gcd(a, b-a)性质3 如果a=b,则a和b的最⼤公约数与a值和b值相同,即Gcd(a, b) = a = b*//*⾮递归*/int Gcd(int a, int b){ if (a <= 0 || b <= 0) return -1; while (a != b) { if (a > b) a = a - b; else if (b > a) b = b - a; }return a;}/*递归*/int Gcd(int a,int b){ if(a<=0 || b<=0) return 0; if(a==b) return a; else if(a>b) return Gcd(a-b,b); else return Gcd(a,b-a);}。
c语言枚举法(穷举法)
for (x=0;x<=14;x++)
for (y=0;y<=25;y++)
if (7*x+4*y==100 )
{
z=100-x-y;
printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z);
}
}
第3章 程序控制结构
课堂讨论:谁做的好事?
有四位同学中的一位做了好事,不留名,表扬信来了 之后,校长问这四位是谁做的好事。
三重循环
第3章 程序控制结构
void main()
{
int x,y,z;
for (x=0;x<=100;x++)
for (y=0;y<=100;y++)
for (z=0;z<=100;z++)
?
{
if (x+y+z==100 && 5*x+3*y+z/3==100 )
printf("x=%d,y=%d,z=%d\n",x,y,z);
#include<stdio.h>
void main( )
{
char thisman;
int sa,sb,sc,sd,cond;
for (thisman='A'; thisman<='D'; thisman++)
{
sa=(thisman != 'A');
sb=(thisman == 'C');
sc=(thisman == 'D');
Linux环境下C语言编程,穷举法求函数最值
Linux环境下C语言编程,穷举法求函数最值由于windows系统与linux系统中库函数不尽相同,所以常常在TC或VC下编译并运行成功的程序中,在linux下编译失败,这是要尤唯头痛的。
下面是在linux下已经编译并运行成功的穷举法求函数最值的C语言代码,将其放在linux中wang(以wang为例)文件夹下,并命名为max.c的文件。
源化代码如下(输入文件是file in.txt ,输入文件是file out.txt ):#include "stdio.h"#include "math.h"#include "float.h"#include "stdlib.h"#include "limits.h"#include <curses.h>#define min 2.2250738585072014e-308double X,Y,Z,Z0,M,D0;FILE *fpin,*fpout;/*calculate F(max)*/double Zmax(double Xmax,double Xmin,double Ymax,double Ymin,double Precision) {double i,j,Z0=min,Z1;for(i=Xmin;i<=Xmax;i=i+Precision){for(j=Ymin;j<=Ymax;j=j+Precision){Z1=1/(i*i+j*j);if(Z1>Z0){Z0=Z1;X=i;Y=j;D0=1/(1+X+Y);}}}return Z0;}main(){double Xmax,Xmin,Ymax,Ymin,Precision;if((fpin=fopen("file in.txt","r"))==NULL) /*file input*/{printf(" Cannot open file in.txt\n strike any key exit!");getchar();exit(1);}if((fpout=fopen("file out.txt","a"))==NULL) /*file put out*/{printf(" Cannot open file out.txt\n strike any key exit!\n");getchar();exit(1);}while(!feof(fpin)){fscanf(fpin,"%lf%lf%lf%lf%lf",&Xmin,&Xmax,&Ymin,&Ymax,&Precision);printf("\nXmin=%lf,Xmax=%lf,Ymin=%lf,Ymax=%lf,Precision=%lf\n",Xmin,Xmax,Ymin,Y max,Precision);double Zmax(double Xmax,double Xmin,double Ymax,double Ymin,double Precision);Z=Zmax(Xmax,Xmin,Ymax,Ymin,Precision);fprintf(fpout,"Zmax=%lf,X=%lf,Y=%lf,D0=%lf\n",Z,X,Y,D0);printf("Zmax=%lf,X=%lf,Y=%lf,D0=%lf\n",Z,X,Y,D0); /*screen put out*/}fclose(fpin);fclose(fpout);}然后在linux下依次下列三个命令即可。
C语言求最大公约数和最小公倍数算法总结
C语言求最大公约数和最小公倍数算法总结单位:山东科技大学作者:左键摘要:介绍自己通过学习使用C语言求任意两个数的最大公约数和最小公倍数的基本算法思想、算法过程、代码实现以及分析比较。
关键词:C语言算法最大公约数最小公倍数中图分类号:TP312 文献标识码:AThe algorithm summarization of evaluating the greatest common divisor and the least common multiple in C LanguageAbstract:Introduction to the algorithm basic thought, algorithm process and code realization and itsanalysing comparison in terms of evaluating the greatest common divisor and the least common multiple of any two positive integers by learning to using C LanguageKeywords:C Language algorithm the greatest common divisor the least common multipleC语言求最大公约数和最小公倍数可以说是C语言编程学习中一个重点和难点,它常常作为计算机专业学生参加各种考试必须要把握的内容。
其算法方面除常用的辗转相除法外、还可以根据数学定义法、递归调用法等。
下面结合我学习以来的笔记整理、总结几种常用的方法进行比较,以便能够更好的理解、应用、共勉。
前提:假设求任意两个整数的最大公约数和最小公倍数,采用函数调用形式进行。
1、辗转相除法辗转相除法(又名欧几里德法)C语言中用于计算两个正整数a,b的最大公约数和最小公倍数,实质它依赖于下面的定理:a b=0gcd(a,b) =gcd(b,a mod b) b!=0根据这一定理可以采用函数嵌套调用和递归调用形式进行求两个数的最大公约数和最小公倍数,现分别叙述如下:①、函数嵌套调用其算法过程为:前提:设两数为a,b设其中a 做被除数,b做除数,temp为余数1、大数放a中、小数放b中;2、求a/b的余数;3、若temp=0则b为最大公约数;4、如果temp!=0则把b的值给a、temp的值给b;5、返回第第二步;代码:int divisor (int a,int b) /*自定义函数求两数的最大公约数*/{int temp; /*定义整型变量*/if(a<b) /*通过比较求出两个数中的最大值和最小值*/{ temp=a;a=b;b=temp;}/*设置中间变量进行两数交换*/while(b!=0) /*通过循环求两数的余数,直到余数为0*/{temp=a%b;a=b; /*变量数值交换*/b=temp;}return (a); /*返回最大公约数到调用函数处*/}int multiple (int a,int b) /*自定义函数求两数的最小公倍数*/{int divisor (int a,int b); /*自定义函数返回值类型*/int temp;temp=divisor(a,b); /*再次调用自定义函数,求出最大公约数*/ return (a*b/temp); /*返回最小公倍数到主调函数处进行输出*/}#include "stdio.h" /*输入输出类头文件*/main(){int m,n,t1,t2; /*定义整型变量*/printf("please input two integer number:"); /*提示输入两个整数*/ scanf("%d%d",&m,&n); /*通过终端输入两个数*/ t1=divisor(m,n); /*自定义主调函数*/t2=multiple(m,n); /*自定义主调函数*/printf("The higest common divisor is %d\n",t1);/*输出最大公约数*/printf("The lowest common multiple is %d\n", t2); /*输出最小公倍数*/}启示:请注意算法中变量数值之间的相互交换方法、如何取模、怎样进行自定义函数及主调函数与被调函数间的相互关系,函数参数的定义及对应关系特点,利用控制语句如何实现。
c语言枚举的用法
c语言枚举的用法在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是:#defineMON1#defineTUE 2#defineWED3#defineTHU 4#defineFRI 5#defineSAT 6#defineSUN 7在此,我们定义一种新的数据类型,希望它能完成同样的工作。
这种新的数据类型叫枚举型。
下面小编就为大家介绍下c语言枚举的用法。
c语言枚举的用法如下:1. 定义一种新的数据类型 - 枚举型以下代码定义了这种新的数据类型 - 枚举型enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。
(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。
(4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。
(5) 枚举型是预处理指令#define的替代。
(6) 类型定义以分号;结束。
2. 使用枚举类型对变量进行声明新的数据类型定义完成后,它就可以使用了。
我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。
用这些基本数据类型声明变量通常是这样:char a;//变量a的类型均为字符型charchar letter;int x,y,z;//变量x,y和z的类型均为整型intint number;double m,n;double result;//变量result的类型为双精度浮点型double既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。
方法一:枚举类型的定义和变量的声明分开enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};enumDAYyesterday;enumDAYtoday;enumDAYtomorrow;//变量tomorrow的类型为枚举型enumDAYenumDAYgood_day,bad_day;//变量good_day和bad_day的类型均为枚举型enumDAY方法二:类型定义与变量声明同时进行:enum//跟第一个定义不同的是,此处的标号DAY省略,这是允许的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
显然,不是'B'所为(四个关系表达式值的和为2)
第3章 程序控制结构
再试C同学,让thisman=‘C’;
代入到四句话中
A说:thisman!=‘A’; B说:thisman==‘C’; C说:thisman==‘D’; D说:thisman!=‘D’; ‘C’!=‘A’ ‘C’==‘C’ ‘C’==‘D’ ‘C’!=‘D’ 真,值为1。 真,值为1。 假,值为0。 真,值为1。
第3章 程序控制结构
枚举法(穷举法)
“笨人之法”: 把所有可能的情况一一测试,筛选出符合 条件的各种结果进行输出。
分析: 这是个不定方程——三元一次方程组问题 (三个变量,两个方程) x+y+z=100 5x+3y+z/3=100 设公鸡为x只,母鸡为y只,小鸡为z只。
第3章 程序控制结构
百元买百鸡问题分析 x+y+z=100 5x+3y+z/3=100
代入到四句话中
A说:thisman!=‘A’; ‘A’!=‘A’ B说:thisman==‘C’; ‘A’==‘C’ C说:thisman==‘D’; ‘A’==‘D’ D说:thisman!=‘D’; ‘A’!=‘D’ 假,值为0。 假,值为0。 假,值为0。 真,值为1。
显然,不是'A'做的好事(四个关系表达式值的和为1)
第3章 程序控制结构
百元买百鸡问题分析
void main() 结果:x=0,y=25,z=75 { x=4,y=18,z=78 int x,y,z; x=8,y=11,z=81 for (x=0;x<=100;x++) x=12,y=4,z=84 for (y=0;y<=100;y++) for (z=0;z<=100;z++) { if (z%3==0 &&x+y+z==100 && 5*x+3*y+z/3==100 ) printf("x=%d,y=%d,z=%d\n",x,y,z); } }
第3章 程序控制结构
课堂讨论:谁做的好事?
有四位同学中的一位做了好事,不留名,表扬信来了 之后,校长问这四位是谁做的好事。 A说:不是我。
B说:是C。
C说:是D。 D说:C胡说。 已知三个人说的是真话,一个人说的是假话。现在要根据 这些信息,找出做了好事的人。
第3章 程序控制结构 编程思路:
如何找到该人,一定是“先假设该人是做好事者,然 后到每句话中去测试看有几句是真话”。“有三句是真话就 确定是该人,否则换下一人再试”。 比如,先假定是A同学,让 thisman='A';
三重循环
第3章 程序控制结构
void main() { int x,y,z; for (x=0;x<=100;x++) for (y=0;y<=100;y++) for (z=0;z<=100;z++) ? { if (x+y+z==100 && 5*x+3*y+z/3==100 ) printf("x=%d,y=%d,z=%d\n",x,y,z); } 结果:x=0,y=25,z=75 } x=4,y=18,z=78 x=8,y=11,z=81 x=12,y=4,z=84 【讨论】为什么多了几组解?
【讨论】
令z=100-x-y 1%)
只进行101×101= 10201 次运算(前者的
第3章 程序控制结构
第3章 程序控制结构
继续优化
void main() 取x<=14,y<=25 只进行 { 15×26= 390 次运算 int x,y,z; for (x=0;x<=14;x++) for (y=0;y<=25;y++) if (7*x+4*y==100 ) { z=100-x-y; printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z); } }
【讨论】 此为“最笨”之法——要进行101×101×101= 1030301次 (100多万次)运算。
第3章 程序控制结构
Hale Waihona Puke 优化void main() 取x<=20,y<=33 只进行 { 21×34= 714 次运算(第 int x,y,z; 1种运算的6.9e-4) for (x=0;x<=100;x++) for (y=0;y<=100;y++) { z=100-x-y; if (z%3==0 && 5*x+3*y+z/3==100 ) printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z); } }
第3章 程序控制结构
再试B同学,让thisman=‘B’;
代入到四句话中
A说:thisman!=‘A’; B说:thisman==‘C’; C说:thisman==‘D’; D说:thisman!=‘D’; ‘B’!=‘A’ ‘B’==‘C’ ‘B’==‘D’ ‘B’!=‘D’ 真,值为1。 假,值为0。 假,值为0。 真,值为1。
cond=sa+sb+sc+sd;
if (cond==3) printf("做好事的人是:%c\n", thisman); } }
显然,就是‘C’做了好事(四个关系表达式值之和为3)
这时,我们可以理出头绪,要用枚举法,一个人一个人地去 试,四句话中有三句为真,该人即所求。
第3章 程序控制结构
#include<stdio.h>
void main( ) { char thisman;
int sa,sb,sc,sd,cond;
for (thisman='A'; thisman<='D'; thisman++) { sa=(thisman != 'A'); sb=(thisman == 'C'); sc=(thisman == 'D'); sd=(thisman != 'D');