一、枚举题
1、用1元5角人民币兑换5分、2分、1分的硬币(每种都要有)共100枚,有多少种方案,每种方案的具体情况?
#include<stdio.h>
int main(){int money=150; //1元5角等于150分int count=0; //记录数量for(int i=1;i<99;i++){ //1分硬币数量for(int j=1;j<99;j++){ //2分硬币数量int k=100-i-j; //5分硬币数量int sum=i+2*j+5*k;if(k>0&&sum==money&&(i+j+k)==100){ count++;printf("一分硬币%d个,二分硬币%d个,五分硬币%d个\n",i,j,k);}}}printf("一共有%d种方案",count);return 0;
}
2、如果一个正整数等于各个数字的立方和,则该数称为阿姆斯特朗数(亦称为自恋性数)。如 407 = 4 3 4^3 43 + 0 3 0^3 03 + 7 3 7^3 73 就是一个阿姆斯特朗数。试编程求1000以内的所有阿姆斯特朗数。
#include<stdio.h>
int main(){for(int i=0;i<10;i++){for(int j=0;j<10;j++){for(int k=0;k<10;k++){int sum=i*100+j*10+k;if(sum>0&&sum==i*i*i+j*j*j+k*k*k){printf("%d是一个阿姆斯特朗数\n",sum);}}}}return 0;
}
3、韩信点兵。韩信有一队兵,他想知道有多少人,便让士兵排队报数。按从1到5 报数,最末一人报的数为1;按从1到6 报数,最末一人报的数为5;按从1到7 报数,最末一人报的数为4;按从1到11 报数,最末一人报的数为10。那么韩信至少有多少兵?
#include<stdio.h>
int main(){int peo=0;while(1){peo++;if(peo%5==1&&peo%6==5&&peo%7==4&&peo%11==10){printf("韩信至少有%d个兵",peo);break;}}return 0;
}
4、任何一个整数n的立方都可以表示成n个相邻奇数之和,编写程序,由键盘输入n,求n的立方是哪些奇数之和。
#include<stdio.h>
int main(){int n; int num=1; //第一个奇数scanf("%d",&n);while(1){num+=2;int temp=n,sum=0;while(temp--){ //n个奇数相加sum+=num;num+=2; // 变成下一个奇数}if(n*n*n==sum){ while(n--){num-=2;printf("%d ",num); //输出整数} break;}}return 0;
}
5、有分数数列2/1+3/2+5/3+8/5+13/8+…… ,编写程序计算前20 项之和
#include<stdio.h>
int main(){int arr[30];arr[0]=1;arr[1]=2;for(int i=2;i<=20;i++){arr[i]=arr[i-1]+arr[i-2];}double sum=0;for(int i=0;i<20;i++){sum+=(double)arr[i+1]/arr[i];}printf("%f",sum);return 0;
}
6、一个素数,当它的数字位置对换以后仍为素数,这样的数称为绝对素数。编写一个程序求出所有的两位绝对素数
#include<stdio.h>
bool isprime(int num){ //判断是否为素数if(num==1){return false;}for(int i=2;i<num/2;i++){ if(num%i==0){return false;}}return true;
}int main(){for(int i=10;i<100;i++){int newi=(i/10)+(i%10)*10;if(isprime(i)&&isprime(newi)){printf("%d是一个绝对素数\n",i);}}return 0;
}
7、1988年世界人口数为50亿,按年增长率11‰计算,从哪一年开始世界人口数超过100亿。
#include<stdio.h>
int main(){double num=50;int year=1988;while(num<=100){num+=num*0.011;year++;}printf("%d年开始世界人口超过100亿",year);return 0;
}
8、甲、乙、丙三位球迷分别预测已进入半决赛的四支球队A、B、C、D的名次如下:
甲预测:A第1名,B第2名;
乙预测:C第1名,D第3名;
丙预测:D第2名,A第3名。
比赛结果,甲、乙、丙预测各对一半,试求A、B、C、D四队的实际名次。
#include<stdio.h>
int main(){for(int A=1;A<=4;A++){ //ABCD四队名次的排列组合for(int B=1;B<=4;B++){if(A==B)continue;for(int C=1;C<=4;C++){if(A==C||B==C)continue;for(int D=1;D<=4;D++){if(A==D||B==D||C==D)continue;if(A==1&&B!=2||A!=1&&B==2) { //甲的预测if(C==1&&D!=3||C!=1&&D==3){ //乙的预测if(D==2&&A!=3||D!=2&&A==3){ //丙的预测printf("四队的实际名次是A=%d,B=%d,C=%d,D=%d",A,B,C,D);}}} }}}}return 0;
}
9、编程计算 1,1+2,1+2+3,…,1+2+…+9 各项值的积。
#include <stdio.h>int main() {long long sum = 0;long long product = 1;for (int i = 1; i <= 9; i++) {sum += i;product *= sum;}printf("结果: %lld\n", product); //防止溢出return 0;
}
10、编程实现,输入一个实数,输出实数中的所有位之和。例如:输入 3.14,输出 3+1+4=8
在这里插入代码片
二、编写函数
1、编写函数实现指定要求的字符串连接功能。
要求:
①不得使用字符串操作库函数。
②主函数输入2个字符串和连接操作的位置与长度,并实现调用。
③子函数void strmid(char str1[],int m,int n,char str2[]),实现将字符串str1从第m个字符开始的n个字符连接到str2串尾。(从1计数)假设str1=“abcdefg”,str2=" 123", m=4,n=3,则通过子函数调用后,串str2变成"123def"
④子函数void print(char a[])实现对操作后的串的输出。
#include <stdio.h>
#include<string.h>
void strmid(char str1[], int m, int n, char str2[]) {int len=strlen(str2);int i, j;for (i = m - 1, j = len; i < m - 1 + n; i++, j++) {str2[j] = str1[i];}str2[j] = '\0'; // 在连接的末尾添加字符串结束标记
}void print(char a[]) {printf("%s", a);
}int main() {char str1[] = "abcdefg";char str2[20] = "123";int m = 4,n = 3;strmid(str1, m, n, str2); // 调用字符串连接函数print(str2); // 输出连接后的字符串return 0;
}
2、编写一个程序从键盘输入10个学生的总成绩,统计10名学生的最高分、最低分和平均分,并按照总成绩对10名学生由高到低排序,要求:
(1)主函数实现调用;
(2)子函数void input实现由键盘输入学生成绩并存入数组,并输出所有学生的最高分、最低分和平均分;
(3)子函数void sort实现对学生成绩由大到小排序,并将排序结果存于数组中。
(4)子函数void print实现对学生成绩数组的输出;
#include<stdio.h>
void input(int grade[]){int max=0,min=100000,avg=0;for(int i=0;i<10;i++){scanf("%d",&grade[i]);if(grade[i]>max)max=grade[i];if(grade[i]<min)min=grade[i];avg+=grade[i];}printf("最高分是%d,最低分是%d,平均分是%d\n",max,min,avg/10);
}
void sort(int grade[]){for(int i=0;i<9;i++){for(int j=0;j<9-i;j++){if(grade[j]<grade[j+1]){int temp=grade[j];grade[j]=grade[j+1];grade[j+1]=temp;}}}
}
void print(int grade[]){for(int i=0;i<10;i++){printf("%d ",grade[i]);}
}
int main(){int grade[10]; input(grade);sort(grade);print(grade);return 0;
}
3、编写两个函数,一个函数实现通过指针将一个字符串反向。例: 串“stude” 的反向串为“eduts” ;而另一个函数实现通过指针求字符串的长度。
在这里插入代码片
4、2.编写函数void f(int a[M][N],int b[N][T],int c[M][T])实现矩阵乘法。根据矩阵运算法则,矩阵元素的值由如下公式求得。
在这里插入代码片
5、输入10个整数,将这10个数按升序排列,并且奇数在前偶数在后。
若输入的10个数是10,9,8,7,6,5,4,3,2,1,则输出1,3,5,7,9,2,4,6,8,10。
要求:
①主函数输入10个数据,并实现调用。
②子函数 void sort(int a[ ])实现题目要求的排序。
③子函数void print(int a[])实现对操作后的数据的输出。
在这里插入代码片
6、求三个数的最小公倍数。
要求 1.主函数完成输入三个整数和实现调用与输出。
2.子函数 int f(int a,int b,int c) 求出最小公倍数
在这里插入代码片
7、子函数void replace(char *s)所实现的功能是:将s所指向的字符串中的每个is都替换成be。按如下要求编写程序:
(1)编程实现该子函数的功能;
(2)在主函数中由键盘输入一个字符串,调用该子函数,然后输出替换后的字符串。
在这里插入代码片
8、编写程序,输入一个小写字母,将该字符转换为大写字母输出。(用putchar()、getchar()函数编写程序)
在这里插入代码片
9、编写一个函数,求一个5×5整型矩阵的两条对角线元素之和。函数头部为double fun(double a[5][5])
在这里插入代码片
10、4.编写一个函数,交换两个数的值,要求用指针实现。
函数头部为: void fun(int *x,int *y)
在这里插入代码片
三、算法设计题
1、长度为L的升序序列S,处在第 L/2 个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若序列S2=(2,4,6,8,20),则S1和S2的中位数是11。
用函数int median(int a[],int b[],int n)求两个等长序列的中位数。其中等长数组a和 b中的元素已按升序排列,n是等长数组的长度。
在这里插入代码片