C语言编程题

C语言编程题

1.编写程序,从键盘输入x的值(要求为整型),根据如下公式计算,并输出x和y的值;

/*
	1.编写程序,从键盘输入x的值(要求为整型),根据如下公式计算,
	并输出x和y的值;
	   ╭
	   │  x		 x<2
	   │  x²+1	 2≤x<6
	y=‹   √x+1	 6≤x<10
	   │   1
	   │­­ -----   x≥10
	   │  x+1
	   ╰
*/
#include<stdio.h>
#include<math.h>
int main() {
	int x;
	double y = 0;
	scanf_s("%d",&x);
	if (x<2) {
		y = x;
		printf("x=%d y=%f",x,y);
	}
	else if (x>=2&&x<6) {
		y = (double)x * x + 1;
		printf("x=%d y=%f", x, y);
	}
	else if (x >= 6 && x < 10) {
		y = sqrt((double)x+1);
		printf("x=%d y=%f", x, y);
	}
	else if (x >= 10) {
		y = 1.0/((double)x+1);
		printf("x=%d y=%f", x, y);
	}
	return 0;
}

2.编写程序,键盘输入一组整数(最大为18位数), 判断它是不是回文数,如果一个自然数和它的个位数字 反向排列所得自然数相等,则称这个数为回文数, 例如,52425和138831是回文数,而12312非回文数;

/*
	2.编写程序,键盘输入一组整数(最大为18位数),
	判断它是不是回文数,如果一个自然数和它的个位数字
	反向排列所得自然数相等,则称这个数为回文数,
	例如,52425和138831是回文数,而12312非回文数;
*/
#include<stdio.h>
int main()
{
	//int a = 12345;
	//int sums = 0;
	//for (int i = 0; i < 7;i++) {
	//	int tmp = a % 10;
	//	printf("a%%10=%d\n",tmp);//取个位
	//	printf("a/10=%d\n",a/=10);//去掉一位
	//	sums = sums * 10 + tmp;//每多一位数字上一个数乘10+个位
	//	printf("sum=%d\n",sums);
	//}
	int n; //用户输入的正整数
	int tmp; //临时存储每一位数
	int sum = 0; //组合后的数
	printf("输入一个数:\n");
	scanf_s("%d", &n);
	//数位遍历
	for (int i = n; i; i /= 10)
	{
		tmp = i % 10;
		sum = sum * 10 + tmp;
	}
	printf("%d\n", sum);
	if (sum == n)
	{
		printf("这个数是回文数。\n");
	}
	else {
		printf("这个数不是回文数。\n");
	}
	return 0;
}

3.编写程序,输出一个n*n矩阵A(n由键盘输入),输出矩阵A的转置矩阵B;

/*
	3.编写程序,输出一个n*n矩阵A(n由键盘输入),输出矩阵A的转置矩阵B;
*/
#include<stdio.h>
int main() {
	int n, a[101][101];
	//输入n的值 确定为几乘几的矩阵
	scanf_s("%d",&n);
	//循环输入为数组赋值
	for (int i = 0; i < n;i++) {
		for (int j = 0; j < n; j++) {
			scanf_s("%d",&a[i][j]);
		}
	}
	//循环遍历输出
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (j==n-1) {
				printf("%d\n", a[j][i]);
			}
			else {
				printf("%d ", a[j][i]);
			}
		}
	}
	return 0;
}

4.编写程序,输入一个整数n,汇出由*组成的边长为n的菱形

/*
	4.编写程序,输入一个整数n,汇出由*组成的边长为n的菱形,例如输入n=5,
				 *
			   *   *
		     *		 *
	       *		   *
         *			     *
	       *		   *
		     *		 *
			   *   *
				 *
*/
#include<stdio.h>
int main() {
	int n;
	scanf_s("%d", &n);
	//正三角形
	for (int i = 1; i <= n; i++) { //控制行数
		//遍历打出菱形左边的空格n=5时4 3 2 1
		for (int j = n-i; j >0; j--) {
			printf(" ");
		}
		//2i-1 = 1 3 5 7
		for (int j = 1; j <= 2 * i - 1; j++) {
			if (j==1||j==2*i-1) {//判断第一个和最后一个输出*
				printf("*");
			}
			else {//其他输出空格
				printf(" ");
			}
		}
		printf("\n");
	}
	//倒三角形
	for (int i = n-1; i >0; i--) {
		for (int j = n - i; j > 0; j--) {
			printf(" ");
		}
		for (int j = 2*i-1; j >0; j--) {
			if (j == 1 || j == 2 * i - 1) {
				printf("*");
			}
			else {
				printf(" ");
			}
		}
		printf("\n");
	}
	return 0;
}

5.编写程序,输入一个正整数n,求13的n次方的后三位数;

/*
 编写程序,输入一个正整数n,求13的n次方的后三位数;
*/
#include<stdio.h>
int main() {
	int n, z = 1;
	scanf_s("%d",&n);
	for (int i = 1; i <= n;i++) {//控制次数
		z = z * 13 % 1000; //取后三位 公式
	}
	printf("13的%d次方的最后三位数是:%d\n", n, z);
	return 0;
}

6.一个正整数如果恰好等于它的因子之和,这个数就称为"完数", 例如6=1+2+3,编写程序求100之内的所有完数;

/*
一个正整数如果恰好等于它的因子之和,这个数就称为"完数",例如6=1+2+3,
编写程序求100之内的所有完数;
*/
#include<stdio.h>
int main() {
	int sum;
	for (int i = 1; i <= 100;i++) { //循环控制1到100
		sum = 0;
		for (int j = 1; j < i;j++) {
			if (i%j==0) { //得到因子数
				sum += j; //因子和
			}
		}
		if (sum==i) { //判断因子和等于本身
			printf("sum=%d\n",sum);
		}
	}
	return 0;
}

7.计算100以内的和

#include<stdio.h>
int main() {
	//需求1:计算1+2+3+4+...100的结果
	int x = 0;
	for (int i = 1; i <= 100; i++) {
		x = x + i;//x+=i;
		printf("%d",x);
	}
	return 0;
}

8.找出100到999之间所有的水仙花数

#include<stdio.h>
int main() {
	//需求2:找出100到999之间所有的水仙花数(153 = 1*1*1 + 5*5*5 +3*3*3)
	int g,s,b;
	for (int i = 100; i < 1000; i++) {
		g = i % 10;   	  //各位
		s = i % 100 / 10; //十位
		b = i / 100;	  //百位
		if (i == g * g * g + s * s * s + b * b * b) {
			printf("%d\n",i);
		}
	}
	return 0;
}

8.蛇形矩阵

#include<stdio.h>
//解题思路:
//(1)1  3  6  10  15       1 + (2)-- > 3 + (3)-- > 6 + (4)-- > 10 + (5)-- > 15     (x)
//(2)2  5  9  14           2 + (3)-- > 5 + (4)-- > 9 + (5)-- > 14
//(3)4  8  13              4 + (4)-- > 8 + (5)-- > 13
//(4)7  12                 7 + (5)-- > 12
//(5)11                    11
//1 + (1)-- > 2 + (2)-- > 4 + (3)-- > 7 + (4)-- > 11     (y)
//输入行数N,num = 1,x = 2, y = 1, 作为初始值;num表示每行第一个数;
//按照上面规律递归处理每一行,求num输出;N == 0为结束条件;
void output(int n, int mun, int x, int y); //函数声明
int main(){
	int n; scanf_s("%d", &n);
	if ( n!= EOF){//EOF表示文件结尾
		output(n, 1, 2, 0);
	}
	return 0;
}
/*----------------------------------------------*/
void output(int n, int num, int x, int y){
	if (n == 0) return;
	int num1 = num, x1 = x;
	for (int i = 1; i < n; i++){
		printf("%d ", num);
		num += x;
		x++;
	}
	printf("%d\n", num);
	//修改初始值
	n--; y++; num1 += y; x1++;
	//递归调用
	output(n, num1, x1, y);
	return;
}

9.字符逆序输出

#include <stdio.h>
#include <string.h>
/**
	 题目描述:将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。
	 输入:输入包括一行。 第一行输入的字符串。
	 输出:输出转换好的逆序字符串。
	 样例输入:I am a student
	 样例输出:tneduts a ma I
 * */
int main(void) {
	char strinput[100] = { 0 }; //为了消除没有零终止符的警告 定义完之后直接赋值个0
	scanf_s("%[^\n]", strinput, 100); //除了换行符以外的字符全部接收
	char stroutput[100];
	int i = 0, j = 0;
	int len = strlen(strinput);//可能会出现 可能没有为字符串"XXX"添加字符串零终止符 的警告
	//逆序拷贝
	for (i = len - 1; i >= 0; i--) {
		stroutput[j++] = strinput[i];
	}
	stroutput[j] = 0; //或 '\0' 
	printf("%s\n", stroutput);
	return 0;
}

10.猜谜语,扣金币

#include <stdio.h>
/**题目 小明很喜欢猜谜语。 最近,他被邀请参加了X星球的猜谜活动。
每位选手开始的时候都被发给777个电子币。
规则是:猜对了,手里的电子币数目翻倍,
猜错了,扣除555个电子币, 扣完为止。
小明一共猜了15条谜语。
战果为:vxvxvxvxvxvxvvx
其中v表示猜对了,x表示猜错了。
请你计算一下,小明最后手里的电子币数目是多少。
请填写表示最后电子币数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路 直接计算器算都可以算出来,所以就不过多的说啥了。
答案 58497*/
int main(){
	int x = 777;
	int b[15]  = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0 };
	for (int i = 0; i < 15; i++) {
		if (b[i] == 1) {
			x *= 2;
		}
		else {
			x -= 555;
		}
	}
	printf("%d\n",x);
	return 0;
}

11.公鸡5元1只,母鸡3元1只,小鸡1元3只, 100元要买100只鸡,且必须包含公鸡、母鸡、 小鸡。编写程序,输出所有可能的方案。

/*
	公鸡5元1只,母鸡3元1只,小鸡1元3只,
	100元要买100只鸡,且必须包含公鸡、母鸡、
	小鸡。编写程序,输出所有可能的方案。
*/
#include <stdio.h>
void main() {
	int a, b, c;
	printf("%6s%6s%6s\n", "公鸡", "母鸡", "小鸡");
	for (a = 0; a <= 20; a++) {//公鸡最多能买20只
		for (b = 0; b <= 33; b++) {//母鸡最多能买33只
			for (c = 0; c <= 300; c += 3) {//小鸡最多能买300只
				//公鸡+母鸡+小鸡共100只且公鸡价格+母鸡价格+小鸡价格共100元
				if (a + b + c == 100 && 5 * a + 3 * b + c / 3 == 100) {
					printf("%6d%6d%6d\n", a, b, c);//满足条件则输出
				}
			}
		}
	}
}

12.编写程序,在一个二维数组a中选出各行最大的元素组成一个一维数组b

/*
	编写程序,在一个二维数组a中选出各行最大的元素组成一个一维数组b
*/
#include<stdio.h>
int main() {
	int a[][4] = { {10,16,87,65} ,{14,32,11,108} ,{10,25,12,37} };
	int b[3], max; //三个大数组所以有三个最大的
	for (int i = 0; i < 3;i++) {
		max = a[i][0];//每一行的第一个
		for (int j = 0; j < 4;j++) {
			if (a[i][j]>max) {
				max = a[i][j];  //找出每个大数组中最大的
			}
		}
		b[i] = max;//将找出的每个数组中最大的赋值给b数组的每个空间
	}
	//遍历数组中的元素 
	for (int i = 0; i < 3;i++) {
		for (int j = 0; j < 4;j++) {
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	//遍历找到的最大的元素数组
	for (int i = 0; i < 3;i++) {
		printf("%d ",b[i]);
	}
	printf("\n");
	return 0;
}

13.耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒, 请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号 :1,2,3,1,2,3…。凡是报到“3”就退出圈子, 最后留在圈子内的人就是出卖耶稣的叛徒。请找出它原来的序号。

#include <stdio.h>
/**约瑟夫环
耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒,
请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号
:1,2,3,1,2,3...。凡是报到“3”就退出圈子,
最后留在圈子内的人就是出卖耶稣的叛徒。请找出它原来的序号。
 * */
int main() {
    int a[13] = { 1,2,3,4,5,6,7,8,9,10,11,12,13 };
    int number = 13;//记录当前人数
    int count = 0;//1,2,3报数
    int i = 0;
    while (number > 1) {
        if (a[i] != 0) { //如果有人就报数
            count++;
        }
        if (count == 3) { //报到3
            a[i] = 0;//剔除的人
            count = 0;
            number--;
        }
        i++;
        if (i == 13) {
            i = 0;
        }
    }
    for (i = 0; i < 13; i++) {
        if (a[i] > 0) {
            printf("%d ", a[i]);
        }
    }
	return 0;
}


14.c语言编写程序:输入三角形的三条边, 判断它们能否构成三角形, 若能则指出何种三角形.

/**
c语言编写程序:输入三角形的三条边,
判断它们能否构成三角形,
若能则指出何种三角形.
* */
#include<stdio.h> 
#include<math.h> 
int main(){
	double a, b, c;
	printf("请输入a b c的值每个数字空格隔开:\n");
	scanf_s("%lf %lf %lf", &a, &b, &c);
	if (a + b > c && b + c > a && c + a > b) {
		if (a == b && a == c && b == c) {
			printf("等边三角形\n");
		} else if (a == b || a == c || b == c){
			printf("等腰三角形\n");
		} else if ((a * a + b * b == c * c) || (a * a + c * c == b * b) || (b * b + c * c == a * a)) {
			printf("直角三角形\n");
		}
	} else {
		printf("不能构成三角形\n");
	}
	return 0;
}

15.有一个数学等式:ab*cd=ba*dc,式中的一个字母代表一位数字, 编写程序,找出所有符合上述要求的乘积式并打印输出

#include <stdio.h>
int main(){
	int a, b, c, d;
	for (a = 0; a <= 9; a++) {
		for (b = 0; b <= 9; b++) {
			for (c = 0; c <= 9; c++) {
				for (d = 0; d <= 9; d++) {
					if ((a * 10 + b) * (c * 10 + d) == (10 * b + a) * (10 * d + c)) {
						if ((a != b) && (a != c) && (a != d) && (b != c) && (b != d) && (c != d)) {
							printf("%d%d*%d%d=%d%d*%d%d\n", a, b, c, d, b, a, d, c);
						}
					}
				}
			}
		}
	}
	return 0;
}

16.一个偶数总能表示为两个素数之和,请输入任意一个偶数,并把它表 示为两个素数的和,例如输入偶数18,则只要输出18=5+13可, 18=7+11可以不计算

#include<stdio.h>
#include<math.h> //用到开方函数
//该函数判断m是否为素数,如果是则返回1,
int prime(int m){
	if (m < 2) {
		return 0;
	}//若 a 不可被 2 ~ \sqrt{a}之间的数整除,那么a肯定是质数
	for (int i = 2; i <= sqrt(m); i++) {
		if (m % i == 0) { //判断是否可以整除
			return 0; //可以整除则不是素数
		}
	}
	return 1;
}
int main(){
	int n,i;
	printf("请输入一个偶数:");
	scanf_s("%d", &n);
	for (i = 2; i <= n/2; i++) {//取到 n/2 结束,防止重复
		if (prime(i) && prime(n - i)) {//如果都为素数
			break; //程序结束
		}
	}
	printf("%d=%d+%d", n, i, n - i);//输出结果
	return 0;
}

17.输入N个元素的整数数组,然后将其前面各元素按照顺序向后移 m个位置,最后m个数变成最前面的m个数

#include<stdio.h>
#define N 5
int main() {
	int a[N], b[N], m;
	printf("请输入m的值:\n");
	scanf_s("%d",&m);
	//1 2 3 4 5 
	for (int i = 0; i < N; i++) {
		printf("请输入第%d个元素:\n",i+1);
		scanf_s("%d", &a[i]);
	}//m=2 
	for (int i = 0; i < m; i++) {//4 5
		b[i] = a[N - m + i];//将要移动的最后元素保存在数组b中
	}
	for (int i = N - 1; i >= m; i--) {//1 2 3 4 5 -> 1 2 1 2 3
		a[i] = a[i - m];//拿到其他元素从后往前一次赋值
	}
	for (int i = 0; i < m; i++) {//1 2 1 2 3 -> 4 5 1 2 3 
		a[i] = b[i];//将保存在数组b中的元素依次赋值到a数组中的前面位置
	}
	printf("移动后的数组:\n");
	for (int i = 0; i < N; i++) {
		printf("%-3d", a[i]);
	}
	return 0;
}

18.运输公司对用户计算运输费用,距离(s)越长,每公里运费越低。
每公里每吨货物的基本运费3元,距离不同标准不同,标准如下:

S<250公里 标准运价的100% 没有折扣

250<=s<500 公里 标准运价的98% 2%折扣

500<=s<1000 公里 标准运价的95% 5%折扣

1000<=s<2000 公里 标准运价的92% 8%折扣

2000<=s<3000 公里 标准运价的90% 10%折扣

3000<=s 公里 标准运价的85% 15%折扣

编写程序根据距离和货物重量计算运费

#include <stdio.h>
int main(){
	float w, sum, z;
	int x, s;
	printf("请输入重量:");
	scanf_s("%f", &w);
	printf("请输入距离:");
	scanf_s("%d", &s);
	if (s >= 3000)
		x = 12;
	else
		x = s / 250;
	switch (x) {
		case 0:	  z = 0; break; //代表250km以下,折扣z = 0
		case 1:   z = 2; break; //代表250~500km以下,折扣z=2%
		case 2:          break;
		case 3:   z = 5; break; //代表500~1000km,折扣z=5%
		case 4:		     break;
		case 5:          break;
		case 6:          break;
		case 7:   z = 8; break; //代表1000~2000km,折扣z=8%
		case 8:          break;
		case 9:          break;
		case 10:         break;
		case 11:  z = 10; break; //代表2000~3000km,折扣z=10%
		case 12:  z = 15; break; //代表3000km以上,折扣z=15%
		default:printf("输入数据错误!\n"); break;
	}
	sum = 3 * w * s * (1 - z / 100);
	printf("总运费是:%f\n", sum);
	return 0;
}

18.编写程序,已知一个整数数列A中的每个项为其前3个项之和, 请输入数列前3项的值,求此数列的前30项,要求:前3项的值由键盘 输入,如输入1,2,3则数列为1 2 3 6 11 20 37 …

#include<stdio.h>
int main() {
	int arr[31];
	for (int i = 0; i < 3;i++) {
		printf("请输入第%d项:",i+1);
		scanf_s("%d",&arr[i]);
	}
	for (int i = 3; i < 30; i++) {
		arr[i] = arr[i - 1] + arr[i - 2] + arr[i - 3];
	}
	for (int i = 0; i < 30; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

19.一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。

#include<stdio.h>
int main(){
	int i, j, k;  
	//ijk和kji正好相反 所以i和k都不可能为0所以下面从1开始
	//7进制最大到6  因为7要进1所以小于7 最大只能为6
	for (i = 1; i < 7; i++) {
		for (j = 0; j < 7; j++) {
			for (k = 1; k < 7; k++) {
				//找出7进制转换为10进制=9进制转换为十进制的结果
				if (i + j * 7 + k * 7 * 7 == i * 9 * 9 + j * 9 + k){
					printf("这个奇异的三位数是(括号内是进制):\n");
					printf("%d%d%d(7)=%d%d%d(9)=%d(10)\n", k, j, i, i, j, k, i * 9 * 9 + j * 9 + k);
				}
			}
		}
	}
	return 0;
}

20.有一个长度为n的整数数组,找出其中出现次数最多的数m

#include <stdio.h>
void repeated_most(int arr[], int n);
int main()
{
    int n;
    printf("请输入数组长度:");
    scanf_s("%d", &n);
    int num[100];
    for (int i = 0; i < n; i++) {
        printf("为数组第%d个空间赋值:",i+1);
        scanf_s("%d", &num[i]);
    }
    repeated_most(num, n);
    return 0;
}
//查找数组中出现次数最多的数
void repeated_most(int arr[], int n)
{
    int m = arr[0]; //假设第一个值是最大的
    int times = 1; //假设出现最多的次数是1
    for (int i = 0; i < n; i++){ //循环拿到每一个数字
        int temp = 1; //初始化出现的次数为1
        for (int j = 0; j < n; j++){//再次循环拿到每一个数字
            if (arr[j] == arr[i] && j != i) { //判断如果有相同的排出自身
                temp++; //出现次数+1
            }
        }
        if (temp > times){ //判断如果出现次数大于初识的次数
            times = temp; //就将多的次数赋值给times最后结果就是最多的数
            m = arr[i]; //将最多的那个值赋值给m
        }
    }
    printf("%d %d\n", m, times);//输出值和他出现的次数
}

21.有一个 4*4的矩阵,求出该矩阵的两条对角线元素的和

# include <stdio.h>
int main(){
	int a[4][4] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
	int i, j, sum1=0, sum2=0;//定义sum1,sum2,分别存放两条对线元素的和;
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++)
			printf("%-5d", a[i][j]);// 输出该数组矩阵;
		printf("\n");
	}
	printf("\n第一条对角线的元素值分别为:\n");
	for (i = 0; i < 4; i++) {
		printf("a[%d][%d]=%-3d", i, i, a[i][i]);//打印第一条对角线的元素及其值;
		sum1 += a[i][i]; //求出第一条对角线的元素和;
	}
	printf("\n其元素的和值为:%d\n", sum1);
	printf("\n第二条对角线的元素值分别为:\n");
	j = 3;//第二条对角线元素为a[0][3]、a[1][2]、a[2][1]、a[3][0],用j的值约束列的值;
	for (i = 0; i < 4; i++){
		printf("a[%d][%d]=%-3d", i, i + j, a[i][i + j]);//打印第二条对角线的元素及其值;
		sum2 += a[i][i + j]; //求出第二条对角线的元素和;
		j -= 2; //第二条对角线元素列的值每次-1,但是行的值每次+1,所以j的值每次-2;
	}
	printf("\n其元素的和值为:%d\n", sum2);
	printf("\n两条对角线元素的和值为:%d\n", sum1 + sum2);
	return 0;
}

22编写计算多项式的值,输入N的值输出最终结果

/*
	   1      1                1	
S = 1+--- + ----- + ... + -----------
      1+2   1+2+3         1+2+3+...50
编写程序计算并输出多项式的值
*/
#include<stdio.h>
int main() {
	int i, t = 0,n;
	double sum = 0.0;
	printf("请输入N的值:");
	scanf_s("%d",&n);
	for (i = 1; i <= n;i++){
		t += i;
		sum += 1.0 / t;
	}
	printf("%lf", sum);
	return 0;
}

23,输入n(0<n<10),打印杨辉三角形,例如当n=6时输出:

在这里插入图片描述

#include<stdio.h>

void print()//按行数打印杨辉三角
{
    int rows, coef = 1;//定义行数,值
    printf("行数: ");
    scanf_s("%d", &rows);
    //控制行数
    for (int i = 0; i < rows; i++)
    {
        //打印空格
        /*for (int i = 1; i <= rows - i; i++)
            printf("  ");*/
        //
        for (int j = 0; j <= i; j++)//第n行的数字有n项,所以j<=i
        {
            //第一行为1,第一列为1
            if (j == 0 || i == 0)
                coef = 1;
            else
                coef = coef * (i - j + 1) / j;//最后一个每一行i=j,倒数第二行(coef=j)等于列数,
            printf("%4d", coef);
        }
        printf("\n");
    }
 }

int main()
{
    print();
    return 0;
}

24.一个楼梯有20阶台阶,每次只能上1级或2级,走完这20级台阶共有多少种走法?

#include <stdio.h>
/*
N = 1的时候只有一种方法。
N = 2的时候有两种方法。
N = K的时候,可以先走到k-1那里,然后向前走一阶,或者先走到k-2那里然后前走两阶
所以后一个答案是前两个的答案之和
*/
int fun(int n) {
    if (n <= 0)
        return 0;
    if (n == 1)
        return 1;
    if (n == 2)
        return 2;
    return fun(n - 1) + fun(n - 2); //如3层楼梯 就是2层和1层楼梯走法之和
}

int main()
{
    int N;
    printf("请输入楼梯层数:");
    scanf_s("%d", &N);
    printf("上楼方法共:%d种\n", fun(N));
    return 0;
}

25.输入一个十进制整数num,将其转换成temp(2~9)进制后输出

#include <stdio.h>
#define MAX_SIZE 100
int main(){
	int arr[MAX_SIZE]; //存放结果的数组
	int index=0;    	//下标
	int num;			//十进制数
	int temp;			//转换的进制
	printf("请输入十进制数:");
	scanf_s("%d", &num);
	printf("请输入待转换的进制:");
	scanf_s("%d", &temp);
	do{//进制转换 取模运算 得到余数 存入数组
		arr[index++] = num % temp;
		num /= temp;
	} while (num);
	//从后往前遍历数组中有值的空间
	for (int i = index-1; i >= 0;i--) {
		printf("%d", arr[i]);
	}
	printf("\n");
	return 0;
}

26.在文本文件A中存储了如下10个整数:2 1 3 5 4 8 7 6 10 9

编写程序,找出其中的最大值,最小值,并计算平均值存储在文本文件
B中,B中格式如下:
最小值:1
最大值:10
平均值:5.5
#include<stdio.h>
int main() {
	int arr[10];//定义用来存放文件中读取到的数字的数组
	FILE* fp; //定义文件指针变量
	fp = fopen("d:\\demo1.txt", "rt"); //以只读的方式打开C:\\student.txt
	for (int i = 0; i < 10;i++) {
		fscanf_s(fp, "%d", &arr[i]); //从文件中读取
	}
	//读取到文件后找到最大值最小值平均值
	int max = arr[0], min = arr[0];
	double avg = 0, sum = 0;
	for (int i = 0; i < 10;i++) {
		if (max<arr[i]) {
			max = arr[i];
		}
		if (min>arr[i]) {
			min = arr[i];
		}
		sum += arr[i];
	}
	avg = sum/10;
	fp = fopen("d:\\demo2.txt", "wt"); //以只写的方式打开文件
	//写入信息
	fprintf(fp, "最小值:%d\n",min);
	fprintf(fp, "最大值:%d\n", max);
	fprintf(fp, "平均值:%lf\n", avg);
	fclose(fp); //关闭fp所指向的文件
	printf("成功!\n");
	return 0;
}

27.输出等腰三角形

在这里插入图片描述

#include <stdio.h>
int main(){
    int n;
    printf("请输入层数:");
    scanf_s("%d", &n);
    //共输出n行 n=5
    for (int i = 1; i <= n; i++){   //打印的空格数为n-1
        //每行空格数为4 3 2 1 0
        for (int j = 1; j <= n - i; j++) {
            printf(" ");
        }
        //i = 1 2 3 4 5
        //k = 1 3 5 7 9
        //k = 2*i-1
        for (int k = 1; k <= 2 * i-1; k++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

28.输入n(正整数)确定一个N*N的矩阵,将矩阵的每一行按照从小到大顺序排序

#include<stdio.h>
int main() {
	int n, a[100][100];
	//输入n的值 确定为几乘几的矩阵
	printf("请输入n确定为几乘几的矩阵:");
	scanf_s("%d", &n);
	//循环输入为数组赋值
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			printf("输入矩阵中的值:");
			scanf_s("%d", &a[i][j]);
		}
	}
	//输出矩阵
	for (int i = 0; i < n;i++) {
		for (int j = 0; j < n;j++) {
			printf("%4d",a[i][j]);
		}
		printf("\n");
	}
	//每行按照冒泡排序从小到大排序
	for (int i = 0; i < n; i++) { //控制行
		//对每行进行冒泡排序
		for (int j = 0; j < n - 1; j++) { //控制趟数
			for (int k = 0; k < n - j - 1;k++) { //控制次数
				if (a[i][k]>a[i][k+1]) { //比较看是否交换位置
					int n = a[i][k];
					a[i][k] = a[i][k + 1];
					a[i][k + 1] = n;
				}
			}
		}
	}
	//排序后输出
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			printf("%4d", a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

29.编写程序,在一个文件a.txt中读取每行数字找到每行最大的元素写入到b.txt中

A.txt中的内容为:            B.txt写入内容为:
12 16 87 65					87 96 37 46 
15 32 13 96					
10 25 14 37
11 33 23 46
#include<stdio.h>
int main() {
	int arr[4][4];//存储读到的每一行数据
	FILE* fp; //定义文件指针变量
	int max; //定义最大值
	int marr[4];//存储每一行最大的
	int index = 0;//存储索引值
	fp = fopen("d:\\A.txt", "rt"); //以只读的方式打开C:\\student.txt
	for (int i = 0; i < 4; i++) {
		max = arr[i][0]; //假设每一行的第一个最大
		for (int j = 0; j < 4;j++) {
			fscanf_s(fp, "%d", &arr[i][j]); //从文件中读取
			printf("%d ",arr[i][j]); //遍历输出读取到的每一行数据
			if (max<arr[i][j]) {
				max = arr[i][j]; //比较找出最大的
			}
		}
		marr[index] = max;//将最大的赋值给marr数组
		index ++; //索引值++
		printf("\n"); //每输出一行加一个换行
	}
	fp = fopen("d:\\B.txt", "wt"); //wt创建文件写入
	for (int i = 0; i < 4;i++) {
		fprintf(fp, "%d ", marr[i]);
	}
	fclose(fp); //关闭fp所指向的文件
	printf("成功!\n");
	return 0;
}

30.猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,发现只剩下一个桃子了。编写程序求猴子第一天摘了多少个桃子。

/*
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,
发现只剩下一个桃子了。编写程序求猴子第一天摘了多少个桃子。
令:X10=1,根据题意容易得出
	X9=2*(X10+1)
	X8=2*(X9+1)
	…
	Xn=2*(Xn+1+1)
*/
#include<stdio.h> 
//返回第n天时的桃子数
int func(int n){
	if (n == 10)
		return 1;
	else
		return 2 * (func(n + 1) + 1); //当天的桃子数=下一天的桃子数*2+1
}
int main(){
	for (int i = 1; i <= 10; i++) {
		printf("第%d天的桃子数:%d\n", i, func(i));
	}
	return 0;
}

31.一块板上有三根针 A、B、C。A 针上套有 64 个大小不等的圆盘,按照大的在下、小的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动一个圆盘,移动过程可以借助 B 针。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。从键盘输入需移动的圆盘个数,给出移动的过程。

#include <stdio.h>
void move(int, char, char, char);
int num = 1;//记录次数
int main(){
    int n;
    printf("请输入圆环数:");
    scanf_s("%d", &n);
    move(n, 'A', 'B', 'C');
    return 0;
}
/*
步骤1:将A柱子上  P_{1}.........P_{n-1}以某种方法全部放到B柱子上(此时A柱子只有  P_{n},middle柱子上有 P_{1}........P_{n-1},而C(end)柱子上没有盘子)
步骤2:将柱子上仅存的  P_{n}挪到空无一物的C柱子上。
步骤3:将B柱子上剩余的  P_{1}......P_{n-1}全部挪到C柱子上。
*/
//从A到C那B是缓冲区
void move(int n, char a, char b, char c){
    if (n == 1) {
        printf("第%d步:%c-->%c\n", num, a, c);
        num++;
    } else {
        move(n - 1, a, c, b);//从A到B那C是缓冲区
        printf("第%d步:%c-->%c\n", num, a, c);
        num++;
        move(n - 1, b, a, c);//从B到C那A是缓冲区
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序张老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值