循环结构算法举例
- 格式:doc
- 大小:64.50 KB
- 文档页数:7
c语言循环结构经典算法C语言循环结构是程序设计中常用的一种结构,通过循环可以重复执行一段代码,实现重复性的任务。
下面列举了10个经典的算法案例,每个算法都有其特定的应用场景和解决问题的方法。
1. 阶乘计算:计算一个数的阶乘,即该数与小于它的所有正整数的乘积。
通过循环结构可以逐步累乘,最终得到阶乘结果。
2. 素数判断:判断一个数是否为素数,即只能被1和自身整除的数。
通过循环结构可以逐一判断该数是否能被小于它的每个数整除,若能则不是素数。
3. 斐波那契数列:斐波那契数列是指从第3项开始,每一项都等于前两项之和。
通过循环结构可以逐一计算每一项的值,从而得到完整的斐波那契数列。
4. 最大公约数:求两个数的最大公约数,即能同时整除两个数的最大正整数。
通过循环结构可以从较小的数开始逐一判断能否同时整除两个数,找到最大的能整除的数即为最大公约数。
5. 最小公倍数:求两个数的最小公倍数,即能同时被两个数整除的最小正整数。
通过循环结构可以从较大的数开始逐一判断能否被两个数同时整除,找到最小的能被整除的数即为最小公倍数。
6. 简单排序:对一组数进行排序,使其按照从小到大或从大到小的顺序排列。
通过循环结构可以比较相邻的两个数的大小,若顺序不对则交换位置,直到整个序列有序。
7. 数字翻转:将一个正整数从高位到低位逆序排列。
通过循环结构可以依次取出每一位的数字,然后将其乘以相应的权重得到逆序后的结果。
8. 队列模拟:模拟队列的入队和出队操作,实现数据的先进先出。
通过循环结构可以不断接收用户的输入,并根据不同的指令执行相应的操作。
9. 栈模拟:模拟栈的入栈和出栈操作,实现数据的后进先出。
通过循环结构可以不断接收用户的输入,并根据不同的指令执行相应的操作。
10. 二分查找:在一个有序数列中查找指定的元素,通过循环结构可以不断缩小查找范围,直到找到目标元素或确定不存在。
以上是10个经典的C语言循环结构算法,每个算法都有其独特的解决问题的方法。
循环群的例子循环群是代数学中的一个重要概念,它在各个领域都有广泛的应用,如密码学、密码破解、编码理论等。
循环群是一种特殊的群结构,具有很多有趣的性质和特征。
下面我将列举一些循环群的例子,以帮助大家更好地理解和掌握这一概念。
1. 整数加法群(Z,+):这是最简单的循环群,它由所有整数构成,运算为加法。
对于任意整数n,我们可以用加法运算得到n的倍数,即n,2n,3n,……,形成一个循环群。
2. 整数乘法群(Z*,x):这是整数的乘法运算构成的循环群。
对于任意非零整数n,我们可以用乘法运算得到n的幂,即n,n^2,n^3,……,形成一个循环群。
3. 有限域的乘法群(F*,x):有限域是一种特殊的代数结构,它由有限个元素构成,并定义了加法和乘法运算。
其中乘法运算构成一个循环群,这个循环群通常被用于密码学中的椭圆曲线加密算法。
4. 复数单位根群(U(n)):复数单位根是指满足z^n=1的复数z,其中n是一个正整数。
所有满足这个条件的复数构成一个循环群,被称为复数单位根群。
这个循环群在信号处理和图像处理等领域有广泛的应用。
5. 矩阵乘法群(GL(n, R)):GL(n, R)是n阶可逆矩阵构成的群,其中矩阵乘法是运算。
对于任意可逆矩阵A,我们可以用矩阵乘法得到A的幂,即A,A^2,A^3,……,形成一个循环群。
6. 带余除法群(Z/nZ,+):带余除法群是由整数模n的剩余类构成的群,其中运算为模n的加法。
对于任意整数m,我们可以用加法运算得到m的倍数模n的剩余类,即[m],[2m],[3m],……,形成一个循环群。
7. 旋转群(SO(2)):旋转群是二维空间中所有旋转操作构成的群。
其中运算为矩阵乘法。
对于任意角度θ,我们可以用旋转矩阵得到所有绕原点旋转θ的操作,形成一个循环群。
8. 圆周群(S^1):圆周群是单位圆上所有点构成的群,其中运算为复数乘法。
对于任意角度θ,我们可以用复数乘法得到所有绕原点旋转θ的点,形成一个循环群。
循环结构算法举例
1、编程输出1至100之间所有能被17整除的自然数(要求使用continue
语句)
算法分析:
如果自然数i被17整除,予以输出,否则不输出
源程序1:
#include <stdio.h>
void main()
{ int i ;
for(i=1; i<=100; i++)
if (i%17==0) p rintf("%4d", i);
printf("\n");
}
源程序2:(with Continue)
#include <stdio.h>
void main()
{ int i ;
for(i=1; i<=100; i++){
if (i%17!=0) continue;
printf("%4d", i);
}
printf("\n");
}
2、求100之内能被17整除的最大自然数(要求使用break语句)
算法分析1:
如果自然数i(i=1, 2,…,100)被17整除且大于其他能被17整除的自然数,保存下来,循环结束时予以输出
源程序1:
#include <stdio.h>
void main()
{
int i, max=0 ;
for(i=1; i<=100; i++)
if (i%17==0 && i>max) max=i;
printf("%d\n",max);
}
算法分析2:
为了提高程序的效率,减少循环的次数,让自然数i从最大值100开始。
如果自然数i被17整除,输出i后提前结束循环
源程序2:(with break)
#include <stdio.h>
void main()
{
int i,max=0 ;
for(i=100; i>=1; i--)
if (i%17==0 ){
printf("%d\n",i);
break;
}
}
3、编程打印出下列图案:
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * *
* * * * *
* * *
*
算法分析:
(1)该图案共9行,每行由空格’’、星号’*’、换行’\n’组成
(2)第1至第5行的空格呈递减趋势(4,3,2,1,0),即每行的数量等于5-i;而’*’呈增加趋势(1,3,5,7,9),即每行的数量等于2i-1;
(3)第6至第9行的空格呈增加趋势(1,2,3,4),即每行的数量等于i-5;而’*’呈减少趋势(7,5,3,1),即每行的数量等于2(9-i)+1;
(4)每行末尾都是1个换行符
源程序:
#include <stdio.h>
void main()
{
int i,j ;
for(i=1; i<=5; i++) { //先输出1~5行
for(j=1;j<=5-i; j++) putchar(' '); //先输出5-i个空格
for(j=1;j<=2*i-1; j++) putchar('*'); //再输出2i-1个*
putchar('\n'); //行尾换行
}
//此时i的值为6
for(; i<=9; i++) { //再输出6~9行,
for(j=1;j<=i-5; j++) putchar(' '); //先输出i-5个空格
for(j=1;j<=2*(9-i)+1; j++) putchar('*'); //再输出2(9-i)+1个*
putchar('\n'); //行尾换行
}
}
思考:
(1)本程序中使用函数putchar()实现字符输出,如果使用printf(),括号内的参数使用单引号还是双引号?
(2)第二个for循环的表达式1是空的,为什么?
(3)如果把第二个for循环改成如下形式,循环体应该怎样更改?
for( i=4; i>=1; i--){
/* 请在此处填写循环体语句
*/
}
4、分析下列程序的输出结果:
#include <stdio.h>
void main()
{ int i=-1, j=3, c ;
do{
c= (++i<0) && !(--j==0);
i++;
}while(c); //当C非0时循环
printf("%d, %d\n", i,j);
}
结果:
1,3
分析:
循环次数i j c
0 -1 3 未知
1 1 3 0
首先执行++i,令i由-1增为0,表达式++i的值亦为0
关系运算++i<0的值为0,故运算&&的结果为0,c的值为0
!(--j==0)是&&的第二操作数,在已经明确&&结果为0时不再计算,因此j的值没有减1,由于do-while语句的循环条件是c,即c!=0,而当第一次循环结束时c为0,故结束循环
5、输入两个正整数m和n,求最大公约数和最小公倍数。
算法分析:
(1)当输入值m<=0或n<=0,重新输入m和n。
(2)令p取m,n中较大者,q取m,n中较小者.
(3) p作被除数,q作除数,再令r代表两者的余数(r=p%q),当p不能被q整除时(r!=0),调整p和q: p=q; q=r;
循环中如果r为0,则当前的除数q就是m和n的最大公约数
例1:
例2:
(4)已知原整数m,n和它们的最大公约数p,其最小公倍数为m*n/p。
源程序
#include <stdio.h>
void main()
{ int m,n,p,q,r;
printf("Input two plus numbers:"); //提示输入整数m,n
do{ scanf("%d%d", &m,&n);
}while (m<=0 || n<=0); // 如果m或n不是正整数,需要重新输入
p= m> n? m: n; //p取较大值
q= m<n? m: n; //q取较小值
r= p%q;
while( r!=0){
p=q; q=r; r=p%q;
}
printf("最大公约数是%d, 最小公倍数是%d\n",q, m*n/q); }。