语⾔百马百担求马匹数_C语⾔经典编程题(下)
C语⾔字符串加密和解密算法C语⾔输出等腰三⾓形C语⾔约瑟夫环问题C语⾔整数逆序输出C语⾔三⾊旗问题C语⾔求定积分C语⾔求空间两点之间的距离C语⾔⽇期处
C语⾔字符串加密和解密算法
在本实例中要求设计⼀个加密和解密算法。在对⼀个指定的字符串加密之后,利⽤解密函数能够对密⽂解密,显⽰明⽂信息。加密的⽅式是
将字符串中每个字符加上它在字符串中的位置和⼀个偏移值 5。以字符串“mrsoft”为例,第⼀个字符“m”在字符串中的位置为 0,那
么它对应的密⽂是“'m'+0+5",即 r。
算法思想
在 main() 函数中使⽤ while 语句设计⼀个⽆限循环,并定义两个字符数组,⽤来保存,明⽂和密⽂字符串,在⾸次循环中要求⽤户输⼊字
符串,进⾏将明⽂加密成密⽂的操作, 之后的操作则是根据⽤户输⼊的命令字符进⾏判断,输⼊ 1 加密新的明⽂,输⼊ 2 对刚加密的密⽂
进⾏解密,输⼊ 3 退出系统。
#include #include int main(){ int result=1; int i; int count=0; char Text[128]={'\0'}; char cryptograph[128]={'\0'}; while(1) { if(result==1) {
C语⾔输出等腰三⾓形
本实例要求从键盘输⼊任意整数 n,通过程序运⾏输出对应⾼度为 n 的等腰三⾓形。
算法思想
① 设计以⾼度 n 为参数的⼀个函数,函数返回值为空,在函数体中实现等腰三⾓形的打印;图形的最终打印需要利⽤⼆层循环设计实现。
② 图形共输出 n ⾏,外循环变量 i 表⽰ n ⾏的输出,循环变量的变化范围为 0~(n—1)。③ 循环变量 j 表⽰每⼀⾏的“*”号输出。由于每
⼀⾏的输出不同,第 j ⾏输出空格的个数为 (n—i),第 j ⾏输出“*”号的个数为(2*i+1)。控制“*”号输出的内循环变量 j 的变化范围为
0~(2*i)。④ 在主函数中输⼊ n 作为实参,调⽤定义函数,打印等腰三⾓形。
#include int trangle(int n){ int i,j; for(i=0;i { for(j=0;j<=n-i;j++) putchar(' '); for(j=0;j<=2*i;j++) putchar('*'); putchar('\n'); } return 0;
C语⾔约瑟夫环问题
编号为 1,2,3,…,n 的 n 个⼈围坐⼀圈,任选⼀个正整数 m 作为报数上限值,从第⼀个⼈开始按顺时针⽅向报数,报数到 m 时停
⽌,报数为 m 的⼈出列。从出列⼈的顺时针⽅向的下⼀个⼈开始⼜从 1 重新报数,如此下去,直到所有⼈都全部出列为⽌。
算法思想
每个⼈的编号存放在⼀个数组 a 中,主函数中决定⼈数的个数以及报数的上限值 m,设计⼀个函数实现对应的操作。函数的形参有整型数
组 a、整数 n 和 m,n ⽤来接收传递的⼈数,m ⽤来接收报数上限,函数的返回值为空;函数体中输出出列⼈的顺序。函数中利⽤循环访
问数组中 n 个元素,每次访问元素,设定内循环连续访问 m 个元素,元素访问的下标为 k,访问到第 m 个元素时,如果元素不是 0,此时
输出元素 a[k],再设定 a[k] 为 0,继续访问后⾯的元素。主函数中设定数组 a,从键盘输⼊ n 和 m,利⽤循环产⽣ n 的位置序号存放到
数组 a 中,调⽤函数实现相应的操作。
#include #define N 100int josef(int a[],int n,int m){ int i,j,k=0; for(i=0;i { j=1; while(j { while(a[k]==0) k=(k+1)%n; j++; k
C语⾔整数逆序输出
将⼀个从键盘输⼊的整数存放到⼀个数组中,通过程序的运⾏按照数组中的逆序输出该整数,利⽤递归的⽅法解决问题。
算法思想
设计函数实现数据的逆序存放,设定形参数组接收实参数组的地址,来存储数据的每⼀位。函数体采⽤递归的⽅式解决问题,因此考虑递归
进⾏的条件。例如,把数据 n 存放到数组 s 中,若 n 是⼀位数,则存放 n 到数组中;若 n 不是⼀位数,则存放 n/10 到数组中。问题解
决的难点在于到数据的存放地址,通过不断地取余和整除 10 来得到数据的每⼀位。为了实现数据的逆序存放,每⼀次整除 10 的时候,
同时把存放数据的数组地址后移,这样得到的第⼀位数存放在数组的最后⼀位……通过依次前移,即递归的回归,实现整个数据的存放。通
过函数 convert() 实现字符串中的数字的逆序转换。
#include int convert(char s[],int n){ int i; if((i=n/10)!=0) convert(s+1,i); *s=n%10+'0'; return 0;}int main(){ int num; char str[10]=" "; printf("input inte
C语⾔三⾊旗问题
有⼀根绳⼦,上⾯有红、⽩、蓝三种颜⾊的旗⼦。绳⼦上旗⼦的颜⾊并没有顺序,现在要对旗⼦进⾏分类,按照蓝⾊、⽩⾊、红⾊的顺序排
列。只能在绳⼦上进⾏移动,并且⼀次只能调换两⾯旗⼦,怎样移动才能使旗⼦移动的次数最少?
算法思想 旗⼦在绳⼦上移动,⽽且⼀次只能调换两⾯旗⼦,因此只要保证在移动旗⼦时,从绳⼦的开头开始,遇到蓝⾊旗⼦向前移动,遇
到⽩⾊旗⼦则留在中间,⽽遇到红⾊的旗⼦则向后移动。要使移动次数最少,可以使⽤三个指针 b、w、r 分别作为蓝旗、⽩旗和红旗的指
针。
若 w 指针指向的当前旗⼦为⽩⾊,则 w 指针增加 1,表⽰⽩旗部分增加⼀⾯。若 w 指针指向的当前旗⼦为蓝⾊,则将 b 指针与 w 指针所
指向的旗⼦交换,同时 b 指针与 w 指针都增加 1,表⽰蓝旗和⽩旗部分都多了⼀个元素。若 w 指针指向的当前旗⼦为红⾊,则将 w 指针
与 r 指针所指向的旗⼦交换,同时 r 指针减 1,即 r 指针向前移动,未处理的部分减 1。刚开始时,r 指向绳⼦中最后⼀个旗⼦,之后 r 指
针不断前移,当其位于 w 指针之前,即 r 的值⼩于 w 的值时,全部旗⼦处理完毕,可以结束⽐较和移动旗⼦操作。
在程序中通过宏定义⽤⼤写字母 'B' 'W' 'R' 分别代表蓝⾊、⽩⾊和红⾊;字符数组 “char color[]”表⽰绳⼦上的各种颜⾊的旗⼦;旗⼦移
动时通过⼀个 while 循环判断移动过程是否结束,在 while 循环中根据旗⼦的不同颜⾊进⾏不同的处理。
#include #include #include #define BLUE 'B'#define WHITE 'W'#define RED 'R'#define swap(x,y){char temp;\ temp=color[x];\ color[x]=color[y];\c语言用递归函数求n的阶乘
C语⾔求定积分
利⽤梯形法计算定积分 其中, f(x)=x 3 +3x 2 -x+2。
算法思想
根据定积分的定义分析可得:[x0,x1],[x1,x2],···,[x n-1,x n],将定积分的区间 [a,b] 分成 n 个⼦区间,其中:
若右边的极限存在,其极限值即为定积分的值。理论上区间分得越细,越逼近定积分实际的值,⼀般采⽤梯形法近似计算定积分的值,把区
间 [a,6] 划分成 n 等份,则任意第 f 个⼩梯形的⾯积为 (上底+下底)×⾼/2,s i=H×[f(x i)-1)+f(x i)]/2,其中 x i+1=a+(i+1)×H;
x i=a+i×H;H=(b-a)/n。该实例问题实际上转换为求 n 等份梯形的⾯积累计和。
#include #include float collect(float s,float t,int m,float (*p)(float x));float fun1(float x);float fun2(float x);float fun3(float x);float fun4(float x);int main(){ int n,flag; f
C语⾔求空间两点之间的距离
定义⼀个表⽰三维空间点坐标的结构类型,通过函数求空间上任意两点之间的距离。
算法思想
空间内任意点的坐标有三个,分别为 x 轴⽅向、y 轴⽅向、z 轴⽅向,设定结构体 point,包括三个成员 x、y、z,都为双精度类型。定义
⼀个函数 dist ⽤于计算空间上两点的距离,函数返回值也为 double 类型,函数的参数为结构体 point 的两个变量。
#include #include struct point{ float x; float y; float z;};float dist(struct point p1,struct point p2){ float x,y,z; float d; x=fabs(p1.x-p2.x); y=fabs(p1.y-p2.y)
C语⾔⽇期函数,⽇期处理函数
定义⼀个表⽰⽇期的结构体类型,再分别定义函数完成下列功能:计算某⼀天是对应年的第⼏天,这⼀年⼀共多少天;计算两个⽇期之间相
隔的天数。两个⽇期由键盘输⼊。
算法思想
设定结构体类型表⽰⽇期类型名为 Date,利⽤ typedef 将其定义为⽇期型类型名,有三个整型类型的成员分别表⽰年、⽉、⽇。设定函数
计算输⼊的⽇期是这⼀年的第⼏天。函数的形参为⽇期型变量,函数体中设定整型数组存放每个⽉的天数,⼆⽉份的天数为 28 天;设定函
数判断年份是否为闰年以决定⼆⽉份的天数。根据输⼊的⽇期⽉份,在数组中将相应的⽉份天数求和,假⽇⽈期即为天数。设定函数完成两
个⽇期的⽐较,⽐较形参 d 和 s 两个⽇期的⼤⼩。⾸先⽐较年,同年的⽐较⽉,同⽉的⽐较⽇。变量 start 保存输⼊的⼩的⽇期年份,end
保存输⼊⽇期⼤的年份,然后计算两个⽇期之间的天数。程序由 6 个函数构成,yearday() 函数计算某年的天数,monthday() 函数计算某
年⼆⽉份的天数,dayofyeaK() 函数计算某⽇期是某年的第⼏天,cmpdate() 函数⽐较两个⽇期的⼤⼩,interday() 函数计算两个⽇期之
间的天数;dayofyear() 函数调⽤ monthday() 函数,interday() 函数调⽤ cmpdate() 函数、yearday() 函数、dayofyear() 函数;主函
数调⽤ yearday() 函数、dayofyear() 函数、interday() 函数。
#include #include typedef struct{ int year,month,day;}Date;int yearday(int year){ int yday; if(year%4==0&&year%100!=0||year%400==0) yday=366; els
C语⾔汉诺塔问题,⽤C语⾔实现汉诺塔
汉诺塔问题是指:⼀块板上有三根针 A、B、C。A 针上套有 64 个⼤⼩不等的圆盘,按照⼤的在下、⼩的在上的顺序排列,要把这 64 个
圆盘从 A 针移动到 C 针上,每次只能移动⼀个圆盘,移动过程可以借助 B 针。但在任何时候,任何针上的圆盘都必须保持⼤盘在下,⼩盘
在上。从键盘输⼊需移动的圆盘个数,给出移动的过程。
算法思想
对于汉诺塔问题,当只移动⼀个圆盘时,直接将圆盘从 A 针移动到 C 针。若移动的圆盘为 n(n>1),则分成⼏步⾛:把 (n-1) 个圆盘从 A
针移动到 B 针(借助 C 针);A 针上的最后⼀个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。每做⼀遍,移动的圆盘
少⼀个,逐次递减,最后当 n 为 1 时,完成整个移动过程。因此,解决汉诺塔问题可设计⼀个递归函数,利⽤递归实现圆盘的整个移动过
程,问题的解决过程是对实际操作的模拟。
#include int main(){ int hanoi(int,char,char,char); int n,counter; printf("Input the number of diskes:"); scanf("%d",&n); printf("\n"); counter=hanoi(n,'A','B
C语⾔九九乘法表(五种输出形式)
九九乘法表共 9 ⾏ 9 列,重点考察 for 循环的掌握情况。
下⾯给出了输出完整乘法表、右上、右下、左上、左下乘法表的代码。
【代码⼀】输出完整:#include int main() { int i,j; // i, j控制⾏或列 for(i=1;i<=9;i++) { for(j=1;j<=9;j++) // %2d 控制宽度为两个字符,且右对齐;如果改为【代码⼆】输出右上三⾓形和左上三⾓形:#include int main() { int i,j; for(i=1;i<=9;i++){ for(j=1;j<=9;j++){ if(j //打印⼋个空格,去掉空格就是左【代码三】输出右下和左下三⾓形:#include int main(){ int i,j,n; for(i=1;i<=9;i++){ // 将下⾯的for循环注释掉,就输出左下三⾓形 for(n=1; n<=9-i; n++)
C语⾔杨辉三⾓(两种⽅法)
杨辉三⾓是我们从初中就知道的,现在,让我们⽤C语⾔将它在计算机上显⽰出来。在初中,我们就知道,杨辉三⾓的两个腰边的数都是
1,其它位置的数都是上顶上两个数之和。这就是我们⽤C语⾔写杨辉三⾓的关键之⼀。在⾼中的时候我们⼜知道,杨辉三⾓的任意⼀⾏都
是的⼆项式系数,n 为⾏数减 1。也就是说任何⼀个数等于这个是⾼中的组合数。n 代表⾏数减 1,不代表列数减 1。如:第五⾏的第三个
数就为 =6。现在我们按第⼀种思路来写:先定义⼀个⼆维数组 :a[N][N],略⼤于要打印的⾏数。再令两边的数为 1,即当每⾏的第⼀个
数和最后⼀个数为 1。a[i][0]=a[i][i-1]=1,n 为⾏数。除两边的数外,任何⼀个数为上两顶数之和,即 a[i][j] = a[i-1][j-1] + a[i-1][j]。
最后输出杨辉三⾓。代码如下:
#include #define N 14void main(){ int i, j, k, n=0, a[N][N]; /*定义⼆维数组a[14][14]*/ while(n<=0||n>=13){ /*控制打印的⾏数不要太⼤,过⼤会造成显⽰不规范*/
上⾯的这⼀种⽅法我们⽤到了⼆维数组,下⾯的这⼀⽅法我们将⽤到⾃定义函数。在⾼中我们知道,杨辉三⾓中的任何⼀个数都等于⼀个组
合数,现在我们⽤这⼀公式来做。⾸先,此⽅法代码如下:
#include /* * 定义阶乘,在这⾥可能会想。为什么要⽤float,当我试第⼀次的时候, * 如果⽤int的话,那么在打印⾏数多了以后就会出错。 * 这是因为阶乘的数⽐较⼤
C语⾔求圆周率π(三种⽅法)
题⽬1) 利⽤公式①计求π的近似值,要求累加到最后⼀项⼩于10^(-6)为⽌。题⽬2) 根据公式②,⽤前100项之积计算π的值。题⽬1)提
供了⼀种解法,题⽬2)提供了两种解法,请看解析。题⽬1)的代码:
#include #include #include int main(){ float s=1; float pi=0; float i=1.0; float n=1.0; while(fabs(i)>=1e-6){ pi+=i; n=n+2; // 这⾥设计的很巧妙,
上⾯的代码,先计算π/4的值,然后再乘以4,s=-s; ⽤的很巧妙,每次循环,取反,结果就是,这次是正号,下次就是负号,以此类推。
题⽬2)的代码[代码⼀]:
#include #include int main(){ float pi=1; float n=1; int j; for(j=1;j<=100;j++,n++){ if(j%2==0){ pi*=(n/(n+1)); }else{ pi*=((n+1)/n); }
此算法的主要思想:观察分⼦数列:a1=2 a2=2a3=4 a4=4a5=6 由此得知,当n为偶数时,an=n;当n为奇数
时,an=a(n+1)=n+1;同理观察分⼦数列:b1=1 b2=3b3=3 b4=5b5=5 b6=7b7=7 由此可知,当n为奇数时,bn=n,当n
为偶数时,bn=b(n+1)。综上可知,当n为奇数时,每次应乘以(n+1)/n。当n为偶数时,每次应乘以n/(n+1)。题⽬2)的代码[代码⼆]:
#include #include int main(){ float term,result=1; int n; for(n=2;n<=100;n+=2){ term=(float)(n*n)/((n-1)*(n+1)); result*=term; } printf("pi的值为:%
C语⾔判断素数(求素数)(两种⽅法)
素数⼜称质数。所谓素数是指除了 1 和它本⾝以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任⼀整数整除。
思路1):因此判断⼀个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每⼀个整数去除,如果都不能被整除,那么 m 就是⼀个素数。思
路2):另外判断⽅法还可以简化。m 不必被 2 ~ m-1 之间的每⼀个整数去除,只需被 2 ~ 之间的每⼀个整数去除就可以了。如果 m
不能被 2 ~ 间任⼀整数整除,m 必定是素数。例如判别 17 是是否为素数,只需使 17 被 2~4 之间的每⼀个整数去除,由于都不能
整除,可以判定 17 是素数。原因:因为如果 m 能被 2 ~ m-1 之间任⼀整数整除,其⼆个因⼦必定有⼀个⼩于或等于 ,另⼀个⼤于
或等于 。例如 16 能被 2、4、8 整除,16=2*8,2 ⼩于 4,8 ⼤于 4,16=4*4,4=√16,因此只需判定在 2~4 之间有⽆因⼦
即可。两种思路的代码请看解析。思路1) 的代码:
#include int main(){ int a=0; // 素数的个数 int num=0; // 输⼊的整数 printf("输⼊⼀个整数:"); scanf("%d",&num); for(int i=2;i if(num%i==0){ a+
思路2)的代码:
#include #include void main(){ int m; // 输⼊的整数 int i; // 循环次数 int k; // m 的平⽅根 printf("输⼊⼀个整数:"); scanf("%d",&m); // 求平⽅根,注意s C语⾔输出菱形(详解版)
菱形,就是如下所⽰的图形,总⾏数与总列数相等:写⼀个程序,根据⽤户输⼊的总⾏数,打印出菱形。这个题⽬
主要是出规律,考察读者的逻辑思维。你可以从第⼀⾏开始,遍历所有的列,也可以从第⼀列开始,遍历所有的⾏。下⾯的程序从第⼀⾏
开始,遍历所有的列。设菱形的总⾏数为line,总列数为column,当前⾏为i,当前列为j。上半部分与下半部分的规律不⼀样,应该分开讨
论。我们着眼于星号(*),思考什么条件下输出星号,总结出如下的规律。1) 对于上半部分(包括中间⼀⾏),当前⾏与当前列满⾜如下关系输
出星号:
j>=(column+1)/2-(i-1) (column+1)/2-(i-1)为第i⾏最左边的星号
j<=(column+1)/2+(i-1) (column+1)/2+(i-1)为第i⾏最右边的星号
2) 对于下半部分,当前⾏与当前列满⾜如下关系输出星号:
j>=(column+1)/2-(line-i) (column+1)/2-(line-i)为第i⾏最左边的星号
j<=(column+1)/2+(line-i) (column+1)/2+(line-i)为第i⾏最右边的星号
不满⾜上述条件,则输出空格。于是写出如下的代码:
#include #include int main(){ int line; // 菱形总⾏数 int column; // 菱形总列数 int i; // 当前⾏ int j; // 当前列 printf("请输⼊菱形的⾏数(奇数):"); scanf("%
C语⾔百钱买百鸡问题(详解版)
我国古代数学家张丘建在《算经》⼀书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁⼀,值钱五;鸡母⼀,值钱三;鸡雏
三,值钱⼀;百钱买百鸡,则翁、母、雏各⼏何?翻译过来,意思是公鸡⼀个五块钱,母鸡⼀个三块钱,⼩鸡三个⼀块钱,现在要⽤⼀百块
钱买⼀百只鸡,问公鸡、母鸡、⼩鸡各多少只?
题⽬分析
如果⽤数学的⽅法解决百钱买百鸡问题,可将该问题抽象成⽅程式组。设公鸡 x 只,母鸡 y 只,⼩鸡 z 只,得到以下⽅程式组:A:
5x+3y+1/3z = 100B:x+y+z = 100C:0 <= x <= 100D:0 <= y <= 100E:0 <= z <= 100如果⽤解⽅程的⽅式解这道题需要进⾏
多次猜解,计算机的⼀个优势就是计算速度特别暴⼒并且⽆怨⽆悔,所以我们可以欺负她、蹂躏她!因此我们⽤穷举法的⽅式来解题,需要
101^3 次猜解,但对于计算机来说,⼩ CASE! 代码清单:
#include int main(){ int i, j, k; printf("百元买百鸡的问题所有可能的解如下:\n"); for( i=0; i <= 100; i++ ) for( j=0; j <= 100; j++ ) for( k=0; k <= 100; k+
C语⾔求完数(完全数)(详解版)
问题描述
求某⼀范围内完数的个数。如果⼀个数等于它的因⼦之和,则称该数为“完数”(或“完全数”)。例如,6的因⼦为1、2、3,⽽
6=1+2+3,因此6是“完数”。
问题分析
根据完数的定义,解决本题的关键是计算出所选取的整数i(i的取值范围不固定)的因⼦(因⼦就是所有可以整除这个数的数),将各因⼦累加到
变量s (记录所有因⼦之和),若s等于i,则可确认i为完数,反之则不是完数。
算法设计
对于这类求某⼀范围(由于本题范围不固定,在编程过程中采⽤键盘输⼊的⽅式)内满⾜条件的数时,⼀般⾤⽤遍历的⽅式,对给定范围内的
数值⼀个⼀个地去判断是否满⾜条件,这⼀过程可利⽤循环来实现。本题的关键是求出选取数值i的因⼦,即从1到i-1范围内能整除i的数,
看某⼀个数j是否为i的因⼦,可利⽤语句if(i%j==0)进⾏判断,求某⼀个数的所有因⼦,需要在1到i-1范围内进⾏遍历,同样⾤⽤循环实
现。因此,本题从整体上看可利⽤两层循环来实现。外层循环控制该数的范围2〜n;内层循环j控制除数的范围为1〜i,通过i对j取余,是否
等于0,到该数的各个因⼦。另外应注意每次判断下⼀个选定数之前,必须将变量s的值重新置为0,编程过程中⼀定要注意变量s重新置0
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论