c语言程序设计-求两个数最大公约数
- 格式:doc
- 大小:81.00 KB
- 文档页数:5
实训报告
实训项目名称:
专业班级:
姓名与学号:
完成时间:年月日
基础项目三:求两个数的最大公约数和最小公倍数(函数知识的巩固)
一、实训目的和要求
1、掌握选择结构、循环结构程序设计方法;
2、掌握用函数进行模块化程序设计。
二、实训性质
实训性质: □验证■综合□设计
三、实训任务
从键盘输入两个int类型数据a、b,通过调用函数实现求a与b的两个数的最大公约数和最小公倍数,并定义函数int GCD(int a, int b),int LCM(int a, int b)。
技术要点:
(1)声明函数GCD,LCM:
int GCD(int a, int b);
int LCM(int a, int b)
(2)在主函数输入a、b 调用函数函数GCD,LCM求最大公约数和最小公倍数并输出。
四、实施步骤
(1)运行VC6.0或Visual studio 2010或以上集成环境
(2)建立源文件GCDab.c
(3)根据前述要点编写和输入程序
(4)调试和运行程序,保存结果截图
五、程序代码
六、程序截图。
1. 欧几里得算法函数原型及功能说明欧几里得算法,又称辗转相除法,是用来计算两个非零整数的最大公约数的算法。
它的函数原型及功能说明如下:```cint gcd(int a, int b);```这个函数的功能是计算a和b的最大公约数,并返回结果。
在这个函数中,a和b是要计算的两个整数。
2. 基本原理欧几里得算法的基本原理是利用辗转相除的思想。
该算法的步骤如下:- 用b去除a,得到商q和余数r;- 若r等于0,则a就是所求的最大公约数;- 若r不等于0,则a赋值为b,b赋值为r,继续进行步骤1,直到r 为0为止。
3. 代码实现根据欧几里得算法的基本原理,可以很容易地实现这个函数。
下面是一个简单的C语言实现:```cint gcd(int a, int b) {while (b != 0) {int temp = a b;a = b;b = temp;}return a;}```这段代码首先使用while循环来不断进行辗转相除的过程,直到b为0为止,然后返回a的值,即最大公约数。
4. 应用举例欧几里得算法在数论中有着广泛的应用,可以用来解决很多实际问题。
我们可以利用欧几里得算法来求解两个数的最大公约数,从而简化分数的约分过程;也可以用来判断两个数是否互质,即它们的最大公约数是否为1;还可以用来解决一些与模运算相关的问题,如同余方程的解,线性同余方程的解等。
5. 个人观点欧几里得算法是一种非常简单而又实用的算法,它的应用场景非常广泛。
在实际的编程工作中,我们经常会用到这个算法来解决一些数论或模运算相关的问题。
熟练掌握欧几里得算法的原理和实现方法,对于提高程序的效率和准确性都是非常有帮助的。
欧几里得算法是一种非常重要的算法,它不仅在数论中有着重要的地位,而且在实际的编程中也有着广泛的应用。
掌握欧几里得算法对于提高编程能力和解决实际问题都是非常有益的。
希望大家能够在实际的学习和工作中多多运用这个算法,进一步加深对它的理解和掌握。
C语⾔求最⼩公倍数和最⼤公约数四种算法(经典)求最⼩公倍数的算法:最⼩公倍数=两整数的乘积÷最⼤公约数。
所以该问题可以转化为求最⼤公约数的算法。
求最⼤公约数的四种算法:1. 辗转相除法 :1. a%b得余数c2. 如果c = 0,则b为最⼤公约数3. 如果c不等于0,则a = b,b = c继续执⾏步骤1。
#include<stdio.h>int main() /* 辗转相除法求最⼤公约数 */{int m, n, a, b, t, c;printf("Input two integer numbers:\n");scanf("%d%d", &a, &b);m=a; n=b;while(b!=0) /* 余数不为0,继续相除,直到余数为0 */{ c=a%b; a=b; b=c;}printf("The largest common divisor:%d\n", a);printf("The least common multiple:%d\n", m*n/a);}还有⼀种简写⽅式:int gcd(int a,int b){if (b==0)return a;return gcd(b, a%b);}2. 相减法:1. 若a>b,则a=a-b2. 若a < b,则b=b-a3. 若a=b,则a(或b)即为两数的最⼤公约数4. 若a≠b,则再回去执⾏1#include<stdio.h>int main ( ) /* 相减法求最⼤公约数 */{int m, n, a, b, c;printf("Input two integer numbers:\n");scanf ("%d,%d", &a, &b);m=a; n=b;/* a, b不相等,⼤数减⼩数,直到相等为⽌。
C语言经典代码考试自用C语言是一种通用的高级程序设计语言,经常被用于系统软件和应用软件的开发。
在学习C语言的过程中,熟练掌握经典的代码是非常重要的。
本文将介绍一些C语言经典代码,希望对于C语言的学习和考试有所帮助。
1. Hello World程序Hello World程序是C语言学习的第一步,也是非常经典的代码。
它的目的是输出一行字符串"Hello World!"到屏幕上。
以下是Hello World程序的代码:```c#include <stdio.h>int main() {printf("Hello World!");return 0;}```2. 求两个整数的最大公约数最大公约数是指能同时整除两个数的最大正整数。
以下是求两个整数的最大公约数的代码:```c#include <stdio.h>int gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}}int main() {int num1, num2;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);printf("最大公约数为:%d", gcd(num1, num2));return 0;}```3. 判断一个数是否为素数素数是只能被1和自身整除的数,大于1的自然数中除了2以外都是奇数。
以下是判断一个数是否为素数的代码:```c#include <stdio.h>#include <stdbool.h>bool isPrime(int num) {if (num <= 1) {return false;}for (int i = 2; i * i <= num; i++) { if (num % i == 0) {return false;}}return true;}int main() {int num;printf("请输入一个整数:");scanf("%d", &num);if (isPrime(num)) {printf("%d是素数", num);} else {printf("%d不是素数", num);}return 0;}```4. 查找数组中的最大元素以下是查找数组中的最大元素的代码:```c#include <stdio.h>int findMax(int arr[], int n) {int max = arr[0];for (int i = 1; i < n; i++) {if (arr[i] > max) {max = arr[i];}}return max;int main() {int arr[] = {5, 2, 8, 10, 1};int n = sizeof(arr) / sizeof(arr[0]);printf("数组中的最大元素为:%d", findMax(arr, n));return 0;}```5. 根据用户输入的数字打印对应的星号图案以下是根据用户输入的数字打印对应的星号图案的代码:```c#include <stdio.h>void printPattern(int num) {for (int i = 1; i <= num; i++) {for (int j = 1; j <= i; j++) {printf("* ");}printf("\n");}int main() {int num;printf("请输入一个数字:");scanf("%d", &num);printPattern(num);return 0;}```以上是一些C语言经典代码的示例,涵盖了基本输入输出、循环、递归等常用语法和算法。
c语言18个经典程序1. Hello, World! - 这是经典的C语言第一个程序,用于输出"Hello, World!"。
2. 求两个整数的和 - 用户输入两个整数,程序将计算并输出它们的和。
3. 判断一个数是奇数还是偶数 - 用户输入一个整数,程序将判断并输出该数是奇数还是偶数。
4. 求一个数的平方 - 用户输入一个数,程序将计算并输出该数的平方。
5. 求两个数的最大公约数 - 用户输入两个整数,程序将计算并输出它们的最大公约数。
6. 判断一个数是否为质数 - 用户输入一个正整数,程序将判断并输出该数是否为质数。
7. 求一个数的阶乘 - 用户输入一个正整数,程序将计算并输出该数的阶乘。
8. 生成斐波那契数列 - 用户输入一个正整数n,程序将生成并输出前n个斐波那契数。
9. 判断一个数是否为完全数 - 用户输入一个正整数,程序将判断并输出该数是否为完全数。
10. 判断一个字符串是否为回文字符串 - 用户输入一个字符串,程序将判断并输出该字符串是否为回文字符串。
11. 求一个数的倒数 - 用户输入一个非零实数,程序将计算并输出该数的倒数。
12. 求两个数的最小公倍数 - 用户输入两个正整数,程序将计算并输出它们的最小公倍数。
13. 判断一个年份是否为闰年 - 用户输入一个年份,程序将判断并输出该年份是否为闰年。
14. 生成九九乘法表 - 程序将生成并输出九九乘法表。
15. 判断一个数是否为负数、零或正数 - 用户输入一个实数,程序将判断并输出该数是负数、零还是正数。
16. 判断一个数是否为偶数的平方 - 用户输入一个整数,程序将判断并输出该数是否为偶数的平方。
17. 判断一个数是否为回文数 - 用户输入一个正整数,程序将判断并输出该数是否为回文数。
18. 判断一个字符串是否为回文句子 - 用户输入一个句子,程序将判断并输出该句子是否为回文句子。
这些经典的C语言程序涵盖了基本的输入输出、数学运算、条件判断、循环、字符串处理等方面的知识点。
《C 语言输出最大公约数和最小公倍数》在 C 语言编程中,计算最大公约数和最小公倍数是非常常见的需求之一。
它们是数学中的基本概念,对于计算机科学以及实际问题中都具有重要的意义。
本文将深入探讨如何在 C 语言中输出最大公约数和最小公倍数,并结合实际问题进行分析和应用。
## 1. 最大公约数让我们明确最大公约数的定义。
最大公约数,英文为 Greatest Common Divisor,通常缩写为 GCD,是两个整数的共同约数中最大的一个。
在 C 语言中,我们可以使用欧几里得算法来高效地计算两个数的最大公约数。
欧几里得算法的基本思想是通过不断取余的方式,直到余数为 0,那么除数就是最大公约数。
以下是 C 语言中计算最大公约数的代码示例:```cint gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}}```在上述代码中,我们定义了一个名为 `gcd` 的函数,它接收两个整数参数 `a` 和 `b`,然后通过递归调用自身来计算最大公约数。
这种递归的实现思路非常巧妙,而且在实际的程序中也能够高效地运行。
## 2. 最小公倍数接下来,让我们来讨论最小公倍数。
最小公倍数,英文为 Least Common Multiple,通常缩写为 LCM,是两个整数的共同倍数中最小的一个。
在C 语言中,我们可以通过最大公约数来计算最小公倍数,因为有一个基本的性质:两个整数的最大公约数与它们的最小公倍数的乘积等于这两个整数的乘积。
以下是 C 语言中计算最小公倍数的代码示例:```cint lcm(int a, int b) {return a / gcd(a, b) * b;}```在上述代码中,我们定义了一个名为 `lcm` 的函数,用来计算两个整数的最小公倍数。
通过调用之前我们定义的 `gcd` 函数,可以非常方便地实现对最小公倍数的计算。
C程序设计的常用算法一、求两个整数的最大公约数、最小公倍数分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)(1) 对于已知两数m,n,使得m>n;(2) m除以n得余数r;(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);(4) m←n,n←r,再重复执行(2)。
例如: 求m=14 ,n=6 的最大公约数. m n r14 6 26 2 0void main(){int a,r,n,m,t;printf("please input two numbers:\n");scanf("%d,%d",&m,&n);a=n*m;if (m<n){t=n;n=m;m=t;}r=m%n;while (r!=0){m=n;n=r;r=m%n;}printf("最大公约数:%d\n",n);printf("最小公倍数:%d\n",a/n);}二、判断素数只能被1或本身整除的数称为素数基本思想:把m作为被除数,将2到(int)sqrt(m)之间所有的整数作为除数,如果都除不尽,m就是素数,否则就不是。
(可用以下程序段实现)void main(){int m,i,k;printf("please input a number:\n");scanf("%d",&m);k=sqrt(m);for(i=2;i<k;i++){if(m%i==0) break;}if(i>=k)printf("该数是素数");elseprintf("该数不是素数");}三、排序算法1.冒泡法:冒泡法原理详见教材例7.3,教材134页#include <stdio.h>void BubbleSort(int* pData,int Count) {int iTemp;for(int i=1;i<Count;i++){for(int j=Count-1;j>=i;j--){if(pData[j]<pData[j-1]){iTemp = pData[j-1];pData[j-1] = pData[j];pData[j] = iTemp;}}}}void main(){int data[] = {10,9,8,7,6,5,4}; BubbleSort(data,7);for (int i=0;i<7;i++){printf(“%d\n”, data[i]);}}2.比较交换法比较交换法的程序最清晰简单,每次用当前的元素一一的同其后的元素比较并交换#include <stdio.h>void ExchangeSort(int* pData,int Count){int iTemp;for(int i=0;i<Count-1;i++){for(int j=i+1;j<Count;j++){if(pData[j]<pData[i]){iTemp = pData[i];pData[i] = pData[j];pData[j] = iTemp;}}}}void main(){int data[] = {10,9,8,7,6,5,4};ExchangeSort(data,7);for (int i=0;i<7;i++){printf(“%d\n”, data[i]);}}3.选择法:选择法原理详见教材例10.9,教材241页此处为另一种写法,原理相同#include <stdio.h>void SelectSort(int* pData,int Count){int iTemp;int iPos;for(int i=0;i<Count-1;i++){iTemp = pData[i];iPos = i;for(int j=i+1;j<Count;j++){if(pData[j]<iTemp){iTemp = pData[j];iPos = j;}}pData[iPos] = pData[i];pData[i] = iTemp;}}void main(){int data[] = {10,9,8,7,6,5,4};SelectSort(data,7);for (int i=0;i<7;i++){printf(“%d\n”, data[i]);}}4. 插入法插入法较为复杂,它的基本工作原理是抽出牌,在前面的牌中寻找相应的位置插入,然后继续下一张#include <stdio.h>void InsertSort(int* pData,int Count){int iTemp;int iPos;for(int i=1;i<Count;i++){iTemp = pData[i];iPos = i-1;while((iPos>=0) && (iTemp<pData[iPos])){pData[iPos+1] = pData[iPos];iPos--;}pData[iPos+1] = iTemp;}}void main(){int data[] = {10,9,8,7,6,5,4};InsertSort(data,7);for (int i=0;i<7;i++){printf(“%d\n”, data[i]);}}四、查找法1.顺序查找法(在一列数中查找某数x)基本思想:一列数放在数组a[1]---a[n]中,待查找的数放在x 中,把x与a数组中的元素从头到尾一一进行比较查找。
第六章循环语句6.1 输入两个正数,求最大公约数和最小公倍数.int main(){int a,b,num1,num2,temp; printf(" 请输入两个正整数:\n");scanf("%d,%d",&num1,&num2); if(num1<num2){temp=num1; num1=num2;num2=temp;} a=num1,b=num2; while(b!=0){ temp=a%b; a=b; b=temp;}printf(" 它们的最大公约数为:%d\n",a);printf(" 它们的最小公倍数为:%d\n",num1*num2/a); return 0;} 我觉得这样不是更简单吗:首先用scanf 输入两个整数a,b if(a <b) c=a;else c=b;for(;c>0;c--)if((a%c)&&(b%c)==0)break;printf("最大公约数为%d",c);printf(" 最大公倍数为%d",a*b/c);6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数解:#include <stdio.h>int main(){char c;int letters=0,space=0,degit=0,other=0;printf(" 请输入一行字符:\n");while((c=getchar())!='\n'){ if(c>='a'&&c<='z' || c>'A'&&c<='Z') letters++; else if(c==' ') space++; elseif(c>='0'&&c<='9') digit++; else other++;}printf(" 其中: 字母数=%d 空格数=%d 数字数=%d 其它字符数=%d\n",letters,space, digit,other);return 0;}6.3求s(n)=a+aa+aaa+…+aa••之值,其中a是一个数字,n表示a的位数。
C语言程序设计-第三版-谭浩强主编第6—8章课后习题答案第六章循环语句6.1输入两个正数,求最大公约数和最小公倍数.#includevoidmain(){inta,b,num1,num2,temp;printf(\请输入两个正整数:\\n\canf(\if(num1temp=num1;num1=num2;num2=temp;}a=num1,b=num2;while(b!=0){temp=a%b;a=b;b=temp;}printf(\它们的最大公约数为:%d\\n\printf(\它们的最小公倍数为:%d\\n\}编译已通过6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数.解:#includevoidmain(){charc;intletter=0,pace=0,degit=0,other=0;printf(\请输入一行字符:\\n\while((c=getchar())!='\\n'){if(c>='a'&&c<='z'||c>'A'&&c<='Z')letter++;eleif(c=='')pace++;eleif(c>='0'&&c<='9')digit++;eleother++;}printf(\其中:字母数=%d空格数=%d数字数=%d其它字符数=%d\\n\digit,other);}6.3求(n)=a+aa+aaa++aaa之值,其中a是一个数字,n表示a的位数。
解:voidmain(){inta,n,count=1,n=0,tn=0;printf(\请输入a和n的值:\\n\canf(\printf(\while(count<=n){tn=tn+a;n=n+tn;a=a某10;++count;}printf(\\\n\}6.4求(即1+2!+3!+4!++20!)voidmain(){floatn,=0,t=1;for(n=1;n<=20;n++){t=t某n;=+t;}printf(\\\n\}阶乘利用递归,再求和:#includeuingnamepacetd;longFunc(intn){ if(1==n)returnn;if(n>1)returnn某Func(n-1);}main(){long=0;inti=1;while(i<=6){=+Func(i);i++;}cout<6.5求voidmain(){intk,N1=100,N2=50,N3=10;float1=0.0,2=0.0,3=0.0;for(k=1;k<=N1;k++)/某计算1到100的和某/{1=1+k;}for(k=1;k<=N2;k++)/某计算1到50各数平方和某/{2=2+k某k;}for(k=1;k<=N3;k++)/某计算1到10各数倒数之和某/{3=3+1.0/k;}printf(\总和=%8.2f\\n\}已通过intmain(){intk=1,i=11,j=51;float=0.0;while(k<=10){=+k+k某k+1.0/k;while(k==10&&i<=50){=+i+i某i;while(i=50&&j<=100){ =+j;j++;}i++;}k++;}}6.6所谓“水仙开数”是指一个3位数,其个位数字立方和等于该数本身。
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);}。
2016.03.28—06.30 北京理工大学 MOOCC语言程序设计(下)网上作业答案第一周编程作业1、求最大公约数和最小公倍数(15分)题目内容:编写程序,在主函数中输入两个正整数 a,b,调用两个函数 fun1() 和 fun2(),分别求a 和 b 的最大公约数和最小公倍数,在主函数中输出结果。
输入格式:两个正整数输出格式:最大公约数和最小公倍数输入样例:12,40[回车]输出样例:最大公约数:4[回车]最小公倍数:120[回车]时间限制:500ms内存限制:32000kbCode:#include <stdio.h>int fun1(int m,int n){int r;r=m%n;return r==0?n:fun1(n,r);}int fun2(int m,int n){int t;t=m*n/fun1(m,n);return t;}int main(){ int t,m,n;scanf("%d,%d",&m,&n);if(m<n){t=m;m=n;n=t;}printf("最大公约数:%d\n",fun1(m,n));printf("最小公倍数:%d\n",fun2(m,n));return 0;}2、排序并插入(15分)题目内容:编写程序,在主函数中定义一个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出。
输入格式:9个整数和1个整数输出格式:10个整数输入样例:2,3,1,5,6,76,89,31,90[回车]7[回车]输出样例:1,2,3,5,6,7,31,76,89,90[回车]时间限制:500ms内存限制:32000kbCode:#include <stdio.h>int main(){int t,j,i,n[10];for(i=0; i<9; i++){scanf("%d", &n[i]);if(i<8) scanf(",");}scanf("%d",&n[9]) ;for(i=0;i<9;i++){for(j=0;j<= 8-i;j++){if(n[j] > n[j+1]){t = n[j];n[j] = n[j+1];n[j+1] = t;}}}for(i=0;i<10;i++){printf("%d",n[i]);if(i<9) printf(",");}return 0;}第二周编程作业1、最大公约数(15分)题目内容:输入两个整数m,n,用递归算法实现计算两个数的最大公约数。
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语言求最小公倍数和最大公约数三种算法(经典) 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数。
求最小公倍数算法:最小公倍数=两整数的乘积÷最大公约数求最大公约数算法:(1)辗转相除法有两整数a和b:①a%b得余数c②若c=0,则b即为两数的最大公约数③若c≠0,则a=b,b=c,再回去执行①例如求27和15的最大公约数过程为:27÷15 余1215÷12余312÷3余0因此,3即为最大公约数。
1 #include2 int main() /* 辗转相除法求最大公约数*/3 {4 int m, n, a, b, t, c;5 printf("Input two integer numbers:\n");6 scanf("%d%d",7 m=a; n=b;8 while(b!=0) /* 余数不为0,继续相除,直到余数为0 */9 { c=a%b; a=b; b=c;}10 printf("The largest common divisor:%d\n", a);11 printf("The least common multiple:%d\n", m*n/a);12 }提供一种简写的方式:1 int gcd(int a,int b)2 {3 return b==0?a:gcd(b,a%b);4 }⑵相减法有两整数a和b:①若a>b,则a=a-b②若a③若a=b,则a(或b)即为两数的最大公约数④若a≠b,则再回去执行①例如求27和15的最大公约数过程为:27-15=12( 15>12 ) 15-12=3( 12>3 )12-3=9( 9>3 ) 9-3=6( 6>3 )6-3=3( 3==3 )因此,3即为最大公约数1 #include2 int main ( ) /* 相减法求最大公约数*/3 {4 int m, n, a, b, c;5 printf("Input two integer numbers:\n");6 scanf ("%d,%d", m=a; n=b;7 /* a, b不相等,大数减小数,直到相等为止。
1,写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。
这两个数由键盘输入。
程序设计:
#include<stdio.h>
int hcf(int x,int y)
{int t;
if(x<y)
{t=x;
x=y;
y=t;}
while((t=x%y)!=0)
{x=y;
y=t;}
return y;}
int lcf(int x,int y,int m)
{
return x*y/m;
}
int main()
{int hcf(int,int);
int lcf(int,int,int);
int x,y,h,l;
printf("请输入两个数:");
scanf("%d%d",&x,&y);
h=hcf(x,y);
l=lcf(x,y,h);
printf("最大公约数为:h=%d\n最小公倍数为:l=%d\n",h,l);
return 0;
}
运行结果:
2求方程ax^2+bx+c=0的根,用3个函数分别求当:b^2-4ac大于0、等于0和小于0时的根并输出结果。
从主函数输入a,b,c的值。
程序设计:
#include<stdio.h>
#include<math.h>
void g_two(double a,double b,double c)
{double x1,x2;
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
printf("方程的两个根为:x1=%f\nx2=%f\n",x1,x2); }
void g_one(double a,double b,double c)
{double x;
x=(-b)/(2*a);
printf("方程的两个根为:x1=x2=%f\n",x);
}
void g_zone(double a,double b,double c)
{
printf("无解\n");
}
void main()
{void g_two(double,double,double);
void g_one(double,double,double);
void g_zone(double,double,double);
double a,b,c,t;
printf("请输入a、b、c的值:");
scanf("%lf%lf%lf",&a,&b,&c);
t=b*b-4*a*c;
if(t>0)
g_two(a,b,c);
else if(t==0)
g_one(a,b,c);
else
g_zone(a,b,c);
}
运行结果:
3.写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。
程序设计:
#include<stdio.h>
#include<math.h>
int pri(int a)
{int i,m=1;
for(i=2;i<=sqrt((double)a)&&m==1;i++)
{if(a%i==0)
m=0;
}
return m;
}
int main()
{ int pri(int);
int a;
printf("请输入一个整数:");
scanf("%d",&a);
if(pri(a))
printf("该数是素数\n");
else
printf("该数不是素数\n");
return 0;
}
运行结果:
4.写一个函数,使给定的一个(3×3)二维整形数组转置,即行列互换。
程序设计:
#include<stdio.h>
int main()
{void ex(int a[][3],int y);
int i,j,a[3][3];
printf("请输入一个3*3二维整形数组:\n");
for(i=0;i<=2;i++)
{for(j=0;j<=2;j++)
scanf("%d",&a[i][j]);}
ex(a,3);
printf("行列互换后的数组为:\n");
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
printf("%d ",a[i][j]);
printf("\n");}
return 0;
}
void ex(int a[][3],int y)
{int i,j,t;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
{t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;}
}
运行结果:
5.写一函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串。
程序设计:
#include<stdio.h>
#include <string.h>
int main()
{void inv(char str[]);
char str[100];
printf("请输入字符串:\n");
scanf("%s",str);
inv(str);
printf("请输出反序后的字符串:\n"); printf("%s\n",str);
return 0;
}
void inv(char str[])
{char t;
int i,j;
for(i=0,j=strlen(str);i<(strlen(str))/2;i++,j--) {t=str[i];
str[i]=str[j-1];
str[j-1]=t;}
}
运行结果:。