学习C/C++必须会的一些编程题目!!!

本文通过多个实例展示了C++编程的基础技巧,包括打印菱形、数组处理、排序算法及简单的系统操作等,深入浅出地讲解了循环结构、条件判断等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不定时更新

1.打印菱形

#include<iostream>
using namespace std;
int main()
{
	int n;
	cout <<"请输入你将要打印的菱形的上半部分行数:";
	cin >> n;
	//上半部分
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n - 1 - i; j++)
			cout <<" ";
		for (int j = 0; j < 2 * (i + 1) - 1; j++)
			cout << "8";
		cout <<endl;
	}
	//下半部分
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < 1 + i; j++)
			cout << " ";
		for (int j = 0; j < 2 * (n - 1) - 1 - 2 * i; j++)
			cout << "8";
		cout << endl;
	}
	return 0;
}

2.交换两个int元素的值

//使用中间变量
	int x = 10;
	int y = 20;
	int c = 0;//中间变量
	c = x;
	x = y;
	y = c;
//不使用中间变量
	int x = 10;
	int y = 20;
	x = x + y;
	y = x - y;//上一步x变化为x + y 
	x = x - y;//上一步y变化为x 
	//注:可能会有溢出的问题,即可能会超过int的数据范围

异或的性质

//异或的性质
int x = 10;
	int y = 20;
	x = x ^ y;
	y = x ^ y;//x ^ y ^ y = x
	x = x ^ y; //x ^ y ^ x ^ y ^ y = y;

3.找出数组中只出现一次的数字

#include<stdio.h>

int main()
{
	int i,j;
	int arr[] = { 1,2,3,55,3,2,1};
	int sz = sizeof(arr) / sizeof(arr[0]);//计算arr的元素个数
	for (i = 0; i < sz; i++)
	{
		int count = 0;//计数器,同时在二重循环里面置零
		for(j = 0; j < sz; j++)
		{
			if (arr[i] == arr[j])
				count++;
		}
		//判断
		if(count == 1)
		{
			printf("数组中只出现一次的数字为%d",arr[i]);
			return 0;//直接结束主函数的进行
			//当然你也可以break;
		}
	}
	return 0;
}

感兴趣的小伙伴可以看一下这篇文章的多解
4.写一个简单的关机程序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	char input[20] = { 0 };//存储数据
again:
	printf("注意注意!!!您的系统将在60秒内关机,请输入:我是猪,来取消关机\n");
	system("shutdown -s -t 60");
	scanf("%s",input);
	if(strcmp(input,"我是猪") == 0)
	{
		system("shutdown -a");
	}
	else
		goto again;
	//strcmp为字符串函数中的字符串比较函数,如两个字符相等就返回0
	//包含在头文件<string.h>

	//明确system()-专门用来执行系统指令的包含在头文件<stdlib.h>
	//其中shutdown -s -t 60 表示60秒后注销用户
	//shutdown -a 表示取消关机
	
	return 0;
}

5.求解最小公倍数,最大公约数
多种方法求解最大公约数与最小公倍数

6.while循环实现求满足:1 + 2 + 3 + 4 + 5 + … + N >= M的最小N

#include<stdio.h>

int main()
{
	int M;
	int sum = 0;
	int N = 0;
	scanf("%d",&M);
	while(sum < M)
	{
	//注意一个关键点 ,就是 N - 1还满足左式 < 右式
	//N的时候不满足左式 < 右式
	//所以就有了以下的循环中的N++放在前面
		N++;
		sum += N;
		
	}
	printf("%d",N);
	return 0;
}

7.求出1!+2!+…+N!的值

#include<stdio.h>
//1! + 2! + 3! = 9
int main()
{
	int mul = 1, sum = 0;
	int i,j;
	int N;
	scanf("%d",&N);
	for (i = 1; i <= N; i++)
	{
		mul = 1;//注意这边要初始化mul的值
		for (j = 1; j <= i; j++)
		{
			mul *= j;
		}
		sum += mul;
	}
	printf("%d",sum);
	return 0;
}

8.找出a,b,c中的大数

int main()
{
	int a,b,c;
	int max;
	scanf("%d %d %d",&a,&b,&c);
	max = a > b ? a : b;
	max = max > c ? max : c;
	printf("%d",max);
}

9.不按顺序排序

//if多分枝结构实现
//注:else跟靠的最近的if匹配
#include <stdio.h>
int main()
{
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	if(a<=b && a<=c)//这边是a为最小
	{
		if(b<c)
		  printf("%d %d %d",c,b,a);
		else
		  printf("%d %d %d",b,c,a);
	}
    else//a不是最小
        {
   	    if(b<c)
                if(a<c)
              	   printf("%d %d %d",c,a,b);
	 			else
	 	   			printf("%d %d %d",a,c,b);
	    else
	 		if(b<a)
	           printf("%d %d %d",a,b,c);
	 		else
	 	   		printf("%d %d %d",b,a,c);
        }
}

10.按顺序按元素排序

//法一:
#include<stdio.h>

int main()
{
	//将三个数从大到小输出其中规定a中放最大值,c中放最小值
	int a,b,c;
	int max,min,tmp;
	scanf("%d %d %d",&a,&b,&c);
	tmp = a + b + c;//可能会有溢出

	//得最大值
	max = a > b ? a : b;
	max = max > c ? max : c;
	a = max;

	//得最小值
	min = a < b ? a : b;
	min = min < c ? min : c;
	c = min;

	//得中间值
	b = tmp - max - min;
	printf("a b c从大到小的顺序为 a = %d > b =  %d > c = %d",a,b,c);
	return 0;
}


//法二:
#include<stdio.h>

int main()
{
	int a,b,c;
	int tmp;
	scanf("%d %d %d",&a,&b,&c);
	if(a < b)
	{
		tmp = b;
		b = a;
		a = tmp;
	}
	if (a < c)
	{
		tmp = c;
		c = a;
		a = tmp;

	}//这边的出a的最大值

	if ( b < c)
	{
		tmp = b;
		b = c;
		c = tmp;
	}//这边对b 和 c 进行排序
	printf("a = %d > b = %d > c = %d",a,b,c);
	return 0;
}

11.判断闰年的综合运用

//根据月份判断,根据年份来判断的话,太麻烦了
//年份能被400整除,或能被4整除但不能被100整除,则称为闰年
//否则为平年。
#include <stdio.h>
int main()
{
  int y,m,d;
  scanf("%d%d",&y,&m);
  if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)
     d=31;
  else if(m==4 || m==6 || m==9 || m==11)
     d=30;
  else
  {
      if(y%4==0 && y%100!=0 || y%400==0)
      //这边是闰年的判断条件
   	  d=29;
      else
	  d=28;	 
   }
   printf("%d年%d月有%d天",y,m,d);
   return 0;
}

12.求1~100中所有整数总共含有数字9的个数

#include<stdio.h>

int main()
{
	int count = 0;
	int i = 1;
	for (; i <= 100; i++)
	{
		if (i / 10 == 9)//判断十位上的数字
			count++;
		if (i % 10 == 9)//判断个位数字
			count++;
		//注意不能是else if 不然99中的两个9就只能就算一次
	}
	printf("%d",count);
	return 0;
}

13.打印N * N乘法口诀表

#include<stdio.h>

int main()
{
	int i,j;
	int N;
	scanf("%d",&N);
	for(i = 1; i <= N; i++)
	{
		for (j = 1; j <= i; j++)
		{
			printf("%2d*%2d=%-3d",i,j,i*j);
			//%2d表示右对齐
			//两个占位符
			//前面有个负号表示左对齐
		}
		printf("\n");
	}
	return 0;
}

14.求1/1-1/2+1/3-1/4+…+1/99-1/100的值

#include<stdio.h>

int main()
{
	double sum = 0;//注意数据类型很重要,不能是int
	int i,flag = 1;
	for (i = 1; i <= 100; i++)
	{
		sum += 1.0 * flag / i;
		flag = -flag;//改变正负

	}
	printf("%lf",sum);
	return 0;
}

15.计算排名(数组中的元素无重复)

//法一:
#include<stdio.h>
//往数组中输入10个数字,按照大小计算排名,数字小的排名靠后
//我们采用以空间换时间的做法
int main()
{
	int i;
	int arr1[10] = { 0 };
	int arr2[10] = {1,1,1,1,1,1,1,1,1,1};//排名数组初始化为1,以空间换时间
	//录入数字
	for (i = 0; i < 10; i++)
	{
		scanf("%d",&arr1[i]);
	}
	for (i = 0; i < 10; i++)
	{
		int j = 0;
		for(; j < 10; j++)
		{
			if (arr1[i] < arr1[j])
				arr2[i]++;//排名数组开始变化
		}
	}
	for(i = 0; i < 10; i++)
	{
		printf("元素arr1[%d] = %d,排名为%d\n",i,arr1[i],arr2[i]);
	}
	return 0;
}

//法二:
//快速排序
#include<stdio.h>
//往数组中输入10个数字,按照大小计算排名,数字小的排名靠后
//我们采用以空间换时间的做法
void My_bubble(int* arr1,int sz)
{
	int i,j;
	for (i = 0; i < sz - 1; i++)//趟数
	{
		for (j = 0; j < sz - 1 - i; j++)//交换的对数
		{
			if (arr1[j] > arr1[j + 1])
			{
				int tmp = arr1[j];
				arr1[j] = arr1[j + 1];
				arr1[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int i;
	int arr1[10] = { 0 };
	//录入数字
	for (i = 0; i < 10; i++)
	{
		scanf("%d",&arr1[i]);
	}
	//这边实现冒泡排序函数
	My_bubble(arr1,10);
	for(i = 0; i < 10; i++)
	{
		printf("元素arr1[%d] = %d,排名为%d\n",i,arr1[i],i + 1);
	}
	return 0;
}
//快排会改变数组中的内容,如果我们不想改变原数组中的内容我们可以
//再开辟一个数组来存放原数组

16.打印按要求的数字图形

要求:打印下列数组矩阵
//1 2 3 4
//2 3 4 1
//3 4 1 2
//4 1 2 3
#include<stdio.h>

int main()
{
	int i,j;
	for (i = 1; i <= 4; i++)
	{
		for(j = i; j <= 4; j++)
		{
			printf("%d ",j);
		}
		for (j = 1;j <= i - 1; j++)
		{
			printf("%d ",j);
		}
		printf("\n");
	}

	return 0;
}

17.改变方阵

#include<stdio.h>

int main()
{
	int a[4][4];
	int i,j;
	for (i = 0; i < 4; i++)
	{
		for(j = 0; j < 4; j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	//交换前
	// 1  2  3  4
	// 5  6  7  8
	// 9 10 11 12
	//13 14 15 16
	
	//发现规律,对角线不变
	//其他地方为行列交换

	//交换后
	// 1  5  9  13
	// 2  6  10 14
	// 3  7  11 15
	// 4  8  12 16
	for (i = 0; i < 4; i++)//行
	{
		for ( j = i + 1; j < 4;j++)
		{
			
			int tmp = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = tmp;
		}
	}
	
	for (i = 0; i < 4; i++)
	{
		for(j = 0; j < 4; j++)
		{
			printf("%3d",a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

18.寻找鞍点

#include<stdio.h>

//鞍点定义:二维矩阵中,该行最大的数,该数为所在列中最小的数字
int main()
{
	int a[4][4] = { { 1,7,3,5},{2,8,6,10},{5,6,2,4},{1,10,16,19}};
	int max;
	int i,j,k;
	int row;
	int col;
	for (i = 0; i < 4; i++)
	{

		max = a[i][0];
		for (j = 0; j < 4; j++)
		{
			if (a[i][j] > max)
			{
				max = a[i][j];
				row = i;
				col = j;
			}
		}
		for (k = 0; k < 4; k++)
		{
			if (a[k][col] < max)
				break;
		}
		if (k == 4)//上面的循环遍历完,若满足鞍点的定义,即所在列里面最小,则k = 4
		{
			printf("鞍点所在行%d,所在列%d,鞍点为%d",row,col,a[row][col]);
			return 0;
		}
	}
	return 0;
}

19.二维转置矩阵

#define  N 3
#include<stdio.h>

void Input(int a[][N])//注意函数传参哦
{
	int i,j;
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < N; j++)
			scanf("%d",&a[i][j]);
	}
}

void Output(int a[][N])
{
	int i,j;
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < N; j++)
			printf("%d ",a[i][j]);
		printf("\n");
	}
}

void Change(int a[][N])//实现矩阵转置
{
	int i,j;
	for (i = 0; i < N; i++)
	{
		for (j = i + 1; j < N; j++)
		{
			int tmp = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = tmp;
		}
	}
}



int main()
{
	int a[N][N];
	Input(a);
	printf("转置前:\n");
	Output(a);
	Change(a);
	printf("转置后:\n");
	Output(a);
}

20.模拟实现strcmp函数

#include<stdio.h>
#include<string.h>
int main()
{
	int i;
	char s1[100],s2[100];
	char a1[100],a2[100];
	scanf("%s%s",s1,s2);
	strcpy(a1,s1);
	strcpy(a2,s2);//拷贝
	for (i = 0; i < strlen(a1) || i < strlen(a2); i++)
	{
		if (a1[i] > a2[i])
		{
			printf("1");
			break;
		}
		if (a1[i] < a2[i])
		{
			printf("-1");
			break;
		}
	}
	if (a1[i] == a2[i])
		printf("0");
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值