C语言编程题

C语言编程题

打印9*9乘法表

#include <stdio.h>
int main()
{
	int i = 0, j = 0;
	for (i = 1; i <= 9; i++)
	{
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%-2d ", j, i, i*j);
		}
		printf("\n");
	}
	return 0;
}
输出:
1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=9
1*4=4  2*4=8  3*4=12 4*4=16
1*5=5  2*5=10 3*5=15 4*5=20 5*5=25
1*6=6  2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7  2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8  2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9  2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

编写代码算0到100之间有多少个9

//9 19 29 39 49 59 69 79 89 99  (a%10==9)
//90 91 92 93 94 95 96 97 98 99  (a/10==9)
#include <stdio.h>
int main()
{
	int i=0;
	int count=0;
	for(i=0;i<=100;i++)
	{
		if(i%10==9)
			count++;
		if(i/10==9)
			count++;
	}
	printf("0到100之间有%d个9\n",count);
	return 0;
} 

编写代码计算1/1-1/2+1/3-1/4+1/5-1/6+…-1/100的值

#include <stdio.h>
int main()
{
	int i = 0;
	float sum = 0.0f;//double sum=0.0;
	int flag = 1;
	for (i = 1; i <= 100; i++)
	{
		sum += flag*1.0 / i;
		flag = -flag;
	}
	printf("sum=%f\n", sum);//printf("sum=%lf\n",sum);
	return 0;
}

判断一个数是素数还是合数

思路一:判断一个数是否为素数,只需m把2至m-1的每一个整数都除一下,如果都不能被整除,那么m就是一个素数
思路二:判断一个数是否为素数,只需m把2至√m(根号m)的每一个整数都除一下, 如果都不能被整除,那么m就是一个素数
如判断17是否是一个素数,只需17把2到4之间的每个整数都除一下,由于都不能整除,所以17是素数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
int main()
{
	int i = 0;
	int m, n;
	scanf("%d", &m);
	n = (int)sqrt(double(m));//函数原型:double sqrt(double x)
	if (m == 1)
	{
		printf("%d既不是素数,也不是合数\n", m);
	}
	else
	{
		for (i = 2; i <= n; i++)
		{
			if (m%i == 0)
			{
				printf("%d是一个合数\n", m);
				break;
			}
		}
	}
	
	if (i == (n + 1))
	{
		printf("%d是一个素数\n", m);
	}
	return 0;
}

用筛选法求100之内的素数

筛选法:先把N个自然数按顺序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,然后再把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去…如此下去将会得到全部素数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.
int main()
{
	int arr[100];
	int i,j;
	for (i = 0; i < 100; i++)
	{
		arr[i] = i+1;
	}
	arr[0] = 0;//1不是素数,挖掉
	for (i =1; i < 100; i++)
	{
		if (arr[i] != 0)
		{
			for (j = i + 1; j < 100; j++)
			{
				if (arr[j] % arr[i] == 0)
					arr[j] = 0;//把所有不是素数的都赋值为0
			}
		}
	}
	for (i = 1; i < 100; i++)
	{
		if (arr[i]!=0)
			printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}
输出:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

用选择法对10个整数排序

选择法:就是先将10个数中最小的数与arr[0]对换,再将arr[1]~arr[9]中最小的数与arr[1]对换…每比较一轮,找出一个未经排序的数中最小的一个,共比较9轮.

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int arr[10] = { 7, 3, 9, 1, 5, 4, 6, 2, 8, 10 };
	int i, j, k,tmp;//k存放每一轮最小值的下标
	for (i = 0; i < 9; i++)
	{
		k = i;
		for (j = i + 1; j < 10; j++)
		{
			if (arr[j] < arr[k])
			{
				k = j;
			}
		}
		tmp = arr[i];
		arr[i] = arr[k];
		arr[k] = tmp;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}
输出:
1 2 3 4 5 6 7 8 9 10

求两个数a和 b最大的公约数

负数没有最大公约数和最小公倍数 ,10本身,任何数本身是没有公约数的
方法一:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
int main()
{
	int a, b;
	int i;
again:
	scanf("%d %d", &a, &b);
	if (a<0 || b<0 || a == b)
	{
		printf("输入错误,请重新输入:");
		goto again;
	}
	if (a>b)
	{
		for (i = b; i>0; i--)
		{
			if (a%i == 0 && b%i == 0)
			{
				printf("%d和%d的最大公约数是%d\n", a, b, i);
				break;
			}
		}
	}
	else  //a<b
	{
		for (i = a; i>0; i--)
		{
			if (a%i == 0 && b%i == 0)
			{
				printf("%d和%d的最大公约数是%d\n", a, b, i);
				break;
			}
		}
	}
	return 0;
}

代码优化后:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
int main()
{
	int a, b;
	int i,max,min;
again:
	scanf("%d %d", &a, &b);
	if (a<0 || b<0 || a == b)
	{
		printf("输入错误,请重新输入:");
		goto again;
	}
	max = (a>b ? a : b);
	min = (a>b ? b : a);
	for (i =min; i>0; i--)
	{
		if (a%i == 0 && b%i == 0)
		{
			printf("%d和%d的最大公约数是%d\n", a, b, i);
			break;
		}
	}
	return 0;
}

方法二(写一个函数):

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//Gcd求最大公约数函数
int Gcd(int x, int y) //x>y
{
	int i;
	for (i = y; i>0; i--)
	{
		if (x%i == 0 && y%i == 0)
		{
			return i;
		}
	}
}
int main()
{
	int a, b, max_y;
again:
	scanf("%d %d", &a, &b);
	if (a<0 || b<0 ||a == b)
	{
		printf("输入错误,请重新输入:");
		goto again;
	}
	else
	{
		max_y = Gcd((a>b ? a : b), (a>b ? b : a));
		printf("%d和%d的最大公约数是%d\n", a, b, max_y);
	}
	return 0;
}

无题(’\t’)

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "ab c\t de\rf\tg";
	char arr2[20] = "h\ti\b\bj k";
	int len_1 = strlen(arr1);
	int len_2 = strlen(arr2);
	int i, j;
	for (i = 0; i<len_1; i++)
	{
		if (arr1[i] == ' ')
		{
			arr1[i] = '*';
		}
	}
	for (j = 0; j<len_2; j++)
	{
		if (arr2[j] == ' ')
		{
			arr2[j] = '*';
		}
	}
	printf("%s\n", arr1);//arr1[20]="ab*c\t*de\rf\tg"
	//ab*c    *de	 (中间4个空格)
	//f       gde    (中间7个空格)
	printf("%s\n", arr2);//arr2[20]="h\ti\b\bj*k"
	//h       i      (中间7个空格)
	//h      j*k	 (中间6个空格)
	return 0;
}

求n的阶乘 和1!+2!+3!+4!+…+n!的和

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int n, i;
	long long sum = 0;
	long long fact = 1;
	printf("请输入n:");
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		fact *= i;
		sum += fact;
	}
	printf("%d!=%lld\n",n,fact);
	printf("1!+2!+...+n!=%lld\n", sum);
	return 0;

}

printf()嵌套printf()

printf()函数调用,其返回值为字符长度

#include <stdio.h>
int main()
{
	printf("%d", printf("%d", printf("%d", 26)));//2621
	printf("\n");
	printf("%d\n", printf("%d\n", printf("%d\n", 26)));
	printf("%d65\n", printf("%dk", printf("%d07h", 26)));//2607h5k265
	return 0;
}
输出:
2621
26   //'\n'也是一个字符
3
2
2607h5k265

有一篇文章,共有三行文字,每行有80个字符,要求分别统计出其中英文大写字母,小写字母,数字,空格以及其它字符的个数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char str[3][80] = { 0 };
	int i, j;
	int count1 = 0, count2 = 0, count3 = 0, count4 = 0, count5 = 0;
	for (i = 0; i < 3; i++)
		gets(str[i]);
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 80; j++)
		{
			if (str[i][j] >= 'A' && str[i][j] <= 'Z')
				count1++;
			else if (str[i][j] >= 'a' && str[i][j] <= 'z')
				count2++;
			else if (str[i][j] >= '0' && str[i][j] <= '9')
				count3++;
			else if (str[i][j] == ' ')
				count4++;
			else
				count5++;
		}
	}
	printf("英文大写字母的个数->%d\n小写字母的个数->%d\n数字的个数->%d\n空格的个数->%d\n其它字符的个数->%d\n", count1, count2, count3, count4, count5);
	return 0;
}

二分法查找(输入一个数字,在有序的整型数组里查找,如果找到了就返回其下标)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int k ;
	scanf("%d", &k);
	while (right >= left)
	{
		int mid = (right + left) / 2;
		if (arr[mid]>k)
		{
			right = mid - 1;
		}
		else if (arr[mid]<k)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到%d了,它的下标是%d\n", k, mid);
			break;
		}
	}
	if (right<left)
	{
		printf("找不到%d\n", k);
	}
	return 0;
}

找出一个二维数组中的靶点,即该位置上的元素在该行上最大,在该列上最小,也可能没有靶点

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int arr[4][4] = { { 1, 2,4, 3 }, 
						{ 5, 7, 6, 8 },
						{ 9, 11, 10, 12 },
						{ 13, 14, 15, 16 } };
	int row = 4, col = 4;
	int i, j,k,m,n;//m,n存放靶点
	int count = 0;
	for (i = 0; i < row; i++)
	{
		//找出一行上最大的数所在的位置
		m = i;
		n = 0;
		for (j = 1; j < col; j++)
		{
			if (arr[i][j] > arr[m][n])
				n = j;
		}
		//判断该位置上的数是否是该列上最小的数
		k = row;
		while (k--)//先使用再--
		{
			if (arr[m][n] > arr[k-1][n])
				break;
		}
		if (k == 0)
		{
			printf("找到一个靶点,为[%d][%d]\n", m, n);
			count++;
		}
	}
	if (count == 0)
	{
		printf("没有靶点\n");
	}
	return 0;
}

有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int arr[30] = { -12, -6, 0, 2, 5, 7, 8, 11, 25, 39 };//int arr[11]={ -12, -6, 0, 2, 5, 7, 8, 11, 25, 39 };
	int num, i, j;
	scanf("%d", &num);
	int left = 0, right = 29;//int left = 0, right = 10;
	while (left <= right)  //此时while()可省略
	{
		if (arr[right - 1] > arr[right])
			break;
		right--;
	}
	if (num < arr[0])
	{
		for (i = right; i>0; i--)
		{
			arr[i] = arr[i - 1];
		}
		arr[0] = num;
	}
	else
	{
		for (i = 0; i < right; i++)
		{
			if (num >= arr[i] && num <= arr[i + 1])
			{
				int tmp = arr[i + 1];
				arr[i + 1] = num;
				for (j = right; j>i + 1; j--)
				{
					arr[j] = arr[j - 1];
				}
				arr[i + 2] = tmp;
				break;
			}
		}
		if (i == right)
			arr[right] = num;
	}
	for (i = 0; i < right + 1; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

输出"魔方阵",所谓的魔方阵是指这样的方阵,它的每一行和每一列和对角线之和均相等,要求输出1~n^2的自然数构成的方阵

例如:三阶方阵为
8 1 6
3 5 7
4 9 2
魔方阵中各数排列规律如下:
1)将“1”放在第一行的中间一列;
2)从“2”开始直到n*n为止的各数依次按下列规则存放:前一个数的行数-1=后一个数的行数,前一个数的列数+1=后一个数的列数
3)如果前一个数的行数为1,则后一个数的行数为n(最后一行)
4)如果前一个数的列数为n,则后一个数的列数为1
5)如果按上面规则确定的位置上已经有数,或者前一个数是第1行第n列时,则把后一个数放在前一个数的下面

#define _CRT_SECURE_NO_WARNINGS 1
#define N 20
#include <stdio.h>
int main()
{
	int arr[N][N] = { 0 };
	int n,i,j,a,b;
again:
	printf("请输入魔方阵的阶数n(1<=n<20且n为奇数):");
	scanf("%d", &n);
	if (n % 2 == 0 || n >= 20 || n <= 0)
	{
		printf("输入错误\n");
		goto again;
	}
	int row = 0, col = n / 2;
	arr[row][col] = 1;
	for (i = 2; i <= n*n; i++)
	{
		a = row;
		b = col;  //arr[a][b]存放上一个数
		row -= 1;
		col += 1;
		if (row == -1)
			row = n - 1;
		if (col == n)
			col = 0;
		if (((a == 0) && (b == n - 1)) || (arr[row][col] !=0 ))
		{
			row = a + 1;
			col = b;
			arr[row][col] = i;
		}
		else
			arr[row][col] = i;
		
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
			printf("%3d  ", arr[i][j]);
		printf("\n");
	}

	return 0;
}

编写代码, 演示多个字符从两端移动,向中间汇聚

如:
welcome to China!!!
#####################
w###################!
we#################!!
wel###############!!!

welcome to China!!!

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
	char str1[] = "welcome to China!!!!!";
	char str2[] = "#####################";
	int left = 0;
	int right = strlen(str1) - 1;//strlen(str1)==strlen(str2)
	while (left <= right)
	{
		str2[left] = str1[left];
		str2[right] = str1[right];
		printf("%s\n", str2);
		//休息一秒
		Sleep(1000);//1000毫秒,使用Sleep()函数需要引头文件#include <windows.h> 
		 //使用system()函数需要引头文件#include <stdlib.h> 
		//system("pause");//冻结屏幕---便于观察程序的执行结果(可按任意键继续) 
		left++;
		right--;
	}
	return 0;
}
输出:
w###################!
we#################!!
wel###############!!!
welc#############!!!!
welco###########!!!!!
welcom#########a!!!!!
welcome#######na!!!!!
welcome #####ina!!!!!
welcome t###hina!!!!!
welcome to#China!!!!!
welcome to China!!!!!

编写代码实现,模拟用户登录情景,并且只能登录三次.(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)

#include <stdio.h>
#include <string.h>
int main()
{
	char t_password[20] = "hyj123456";
	char password[20] = { 0 };
	int i = 0;
	for (i = 0; i<3; i++)
	{
		printf("请输入密码>:");
		scanf("%s", password);
		if (strcmp(password, t_password) == 0)
		{
			printf("登录成功\n");
			break;
		}
		else
			printf("输入错误\n");
	}
	if (i == 3)
		printf("三次密码均错误,退出程序\n");
	return 0;
}

编写代码实现电脑关机(关机程序)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60"); //Windows系统下的一个关机命令,60可自由更改为其它数字,单位:秒
	again:
		printf("请注意,你的电脑将在60秒内关机;如果输入:'取消关机',就取消关机\n请输入>:");
		scanf("%s", input);
		if (strcmp(input, "取消关机") == 0)
		{
			system("shutdown -a");
		}
		else
			goto again;
		return 0;
}

实现一个简易的计算器

#define _CRT_SECURE_NO_WARNINGS 1
#define PI 3.1415926
#include <stdio.h>
#include <math.h>
void menu()
{
	printf("*****  1.+            2.-        *****\n");
	printf("*****  3./            4.*        *****\n");
	printf("*****  5.sin()        6.cos()    *****\n");
	printf("*****  7.tan()        8.x!       *****\n");
	printf("*****  9.lg           10.ln      *****\n");
	printf("*****  11.x的y次方    12.根号x   *****\n");
	printf("*****         0.结束计算         *****\n");
}
int main()
{
	int a;
	do
	{
		menu();
	again:
		printf("请输入数字:");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
		{
				 
				  long long x,y, result = 0;
				  printf("请输入x+y=:");//加法
				  scanf("%lld%*c%lld%*c", &x,&y);
				  result= x+y;
				  printf("%lld\n", result);
				  break;
		}
		case 2:
		{
				  int x,y,result= 0;
				  printf("请输入x-y=:");//减法
				  scanf("%lld%*c%lld%*c", &x,&y);
				  result= x-y;
				  printf("%d\n", result);
				  break;
		}
		case 3:
		{
				  double x, y, result;
				  printf("请输入x/y=:");//除法
				  scanf("%lf%*c%lf%*c", &x, &y);
				  result = x/y;
				  printf("%lf\n", result);
				  break;
		}
		case 4:
		{
				  long long x, y, result;
				  printf("请输入x*y=:");//乘法
				  scanf("%lld%*c%lld%*c", &x, &y);
				  result = x * y;
				  printf("%lld\n", result);
				  break;
		}
		case 5:
		{
				  double x,result;
				  printf("请输入(sin(x))x:");
				  scanf("%lf",&x);
				  result = sin(x*PI/180);
				  printf("%f\n",result);
				  break;
		}
		case 6:
		{
				  double x, result;
				  printf("请输入(cos(x))x:");
				  scanf("%lf", &x);
				  result = cos(x*PI/180);
				  printf("%f\n", result);
				  break;
		}
		case 7:
		{
				  double x, result;
				  printf("请输入(tan(x))x:");
				  scanf("%lf", &x);
				  result = tan(x*PI/180);
				  printf("%f\n", result);
				  break;
		}
		case 8:
		{
				  long long x,i;
				  long long result=1;
				  printf("请输入x!=:");
				  scanf("%lld%*c%*c", &x);
				  for (i = 1; i <= x; i++)
				  {
					  result *= i;
				  }
				  printf("%lld\n", result);
				  break;
		}
		case 9:
		{
				  double x, result;
				  printf("请输入(log10(x))x:");
				  scanf("%lf", &x);
				  result = log10(x);
				  printf("%f\n", result);
				  break;
		}
		case 10:
		{
				   double x, result;
				   printf("请输入(ln(x))x:");
				   scanf("%lf", &x);
				   result = log(x);
				   printf("%f\n", result);
				   break;
		}
		case 11:
		{
				   double x,y, result;
				   printf("请输入(x^y)x,y:");
				   scanf("%lf%lf", &x,&y);
				   result = pow(x, y);
				   printf("%f\n", result);
				   break;
		}
		case 12:
		{
				   double x,result;
				   printf("请输入(根号x)x:");
				   scanf("%lf", &x);
				   result = sqrt(x);
				   printf("%f\n", result);
				   break;
		}
		case 0:
		{
				  goto end;
		}
		default:
		{
			printf("输入错误:\n");
			goto again;
		}
	}
	} while (1);
end:
	printf("结束计算\n");
	return 0;
}	

猜数字游戏

时间戳(当前计算机的时间-计算机的起始时间1970年1月1日00:00:00=总秒数)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
	int guess = 0;
	int rand_num= rand() % 100 + 1;//生成1-100之间的随机数 
	while (1)
	{
		printf("请猜测一个数字>:");
		scanf("%d", &guess);
		if (guess>rand_num)
			printf("猜大了\n");
		else if (guess<rand_num)
			printf("猜小了\n");
		else
		{
			printf("恭喜你猜对了\n");
			break;
		}

	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		printf("******  1.开始游戏    2.退出游戏   *****\n请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();//游戏开始
			break;
		case 2:
			goto end;
		default:
			printf("选择错误\n");
			break;
		}
	} while (1);
end:
	printf("退出游戏\n");
	return 0;

}

打印1000年到2000年之间的闰年,并输出1000到2000年之间闰年总数

能被4整除但不能被100整除的是闰年,能被400整除的是闰年

#include <stdio.h>
int main()
{
	int year;
	int count = 0;
	for (year = 1000; year <= 2000; year++)
	{
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
		{
			printf("%d ", year);
			count++;
		}
	}
	printf("\n1000到2000年之间的闰年总数是%d", count);
	return 0;
}

喝汽水,1瓶汽水1块钱,2个空瓶能换一瓶汽水,给30块钱,可以喝多少瓶汽水

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int money, empty, n = 0;//n喝掉的汽水瓶数
	scanf("%d", &money);
	n = money;
	empty =n;
	while (empty >= 2)
	{
		n += empty / 2;
		empty = empty / 2 + empty % 2;
	}
	printf("%d块钱可以喝%d瓶汽水\n", money, n);
	return 0;
}

写一个函数,来调整整型数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分

#include <stdio.h>
void adjust(int arr[], int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		int tmp;
		while ((left < right) && (arr[left] % 2 == 1))//从左边找偶数
		{
			left++;
		}
		while ((left < right) && (arr[right] % 2 == 0))//从右边找奇数
		{
			right--;
		}
		if (left < right)
		{
			tmp = arr[left];    //左边的偶数和右边的奇数交换
			arr[left] = arr[right];
			arr[right] = tmp;
		}
	}
}
int main()
{
	int arr[] = { 2, 5, 7, 3, 4, 8, 6, 12, 9, 11, 1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	adjust(arr, sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}
输出:
1 5 7 3 11 9 6 12 8 4 2

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯中的一个.以下为4个嫌疑犯的供词:A说:不是我;B说:是C;C说:是D;D说:C在胡说.已知3个人说了真话,1个人说的是假话.请根据这些信息,编写一个程序来确定谁是凶手.

#include <stdio.h>
int main()
{
	char killer;
	for (killer = 'A'; killer <= 'D'; killer++)
	{
		//在C语言中,真用1来表示,假用0来表示
		//当表达式为真时返回1,为假时返回0
		if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D')==3)
			printf("%c是凶手\n", killer);
	}
	return 0;
}
输出:
C是凶手

两个乒乓球队进行比赛,各出三人.甲队为A,B,C3人,乙队为X,Y,Z3人.已抽签决定比赛名单.有人向队员打听比赛的名单,A说他不和X比;C说他不和X,Z比.请编写程序找出3对赛手的名单.

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char A, B, C;
	for (A = 'X'; A <= 'Z'; A++)
	{
		for (B = 'X'; B <= 'Z'; B++)
		{
			if (A != B)
			{
				for (C = 'X'; C <= 'Z'; C++)
				{
					if (A != C && B != C)
					{
						if (A != 'X' && C != 'X' && C != 'Z')
							printf("A-%c\nB-%c\nC-%c\n", A, B, C);
					}
					
				}
				
			}
			
		}
		
	}
	return 0;
}
输出:
A-Z
B-X
C-Y

五位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;比赛结束后,每位选手都说对了一半,请编写程序确定比赛名单

#include <stdio.h>
int main()
{
	int A, B, C, D, E;
	for (A = 1; A <= 5; A++)
	{
		for (B = 1; B <= 5; B++)
		{
			for (C = 1; C <= 5; C++)
			{
				for (D = 1; D <= 5; D++)
				{
					for (E = 1; E <= 5; E++)
					{
						//如果表达式为真则返回1,否则返回0
						//1*2*3*4*5=120,为了避免有重复的名次
						if (((B== 2) + (A == 3) == 1) && ((B == 2) + (E == 4) == 1)&& ((C == 1) + (D == 2) == 1) && ((C == 5) + (D == 3) == 1 )&&((E == 4) + (A == 1) == 1) && (A*B*C*D*E ==120))
							printf("A->%d\nB->%d\nC->%d\nD->%d\nE->%d\n", A, B, C, D,E);
					}
				}
			}
		}
	}
	return 0;
}
输出:
A->3
B->1
C->5
D->2
E->4

输出以下图案(菱形):

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i, j,k;
	//先打印上面4行
	for (i = 0; i < 4; i++)
	{
		//打印一行
		for (j = 0; j < 3 - i; j++)
		{
			printf(" ");
		}
		for (k = 0; k < 2 * i + 1; k++) printf("*");
		{
			printf("\n\r");
		}
	}
	//打印下面3行
	for (i = 0; i < 3; i++)
	{
		//打印一行
		for (j = 0; j <= i; j++)
		{
			printf(" ");
		}
		for (k = 0; k < 5 - 2 * i; k++)
		{
			printf("*");
		}
		printf("\n\r");
	}
	return 0;
}
输出:
   *
  ***
 *****
*******
 *****
  ***
   *

输出以下图案

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char str[9][17] = {0};
	int i, j,k;
	for (i = 0; i <9; i++)
	{
		if (i % 2 == 0)
		{
			for (j = 0; j <i; j++)
			{
				str[i][j]=' ';
			}
			int n = 5;//5个"* "
			for (j =i; j <17 && n--; j+=2)
			{
				str[i][j] = '*';
				str[i][j + 1] = ' ';
				if (n == 1)
				{
					for (k = j + 2; k < 17;k++)
					{
						str[i][k] = ' ';
					}
				}

			}
		}
		else
		{
			//一行空格
			for (j = 0; j < 17; j++)
			{
				str[i][j] = ' ';
			}
		}
		
	}
	for (i = 0; i < 9; i++)
	{
		for (j = 0; j < 17; j++)
		{
			printf("%c ", str[i][j]);
		}
		printf("\n");
	}
	return 0;
}
输出:
*   *   *   *   *

    *   *   *   *   *

        *   *   *   *   *

            *   *   *   *   *

                *   *   *   *   *

输入一个数,求其二进制中1或0的个数

方法一:

//输入一个数,求其二进制中1的个数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{	
	int a,i;
	float j = 0;
	int count = 0;
	printf("请输入一个数:");
	scanf("%d", &a);//45
	for (i = 0;i<32;i++)
	{
		if ((a & 1) == 1) count++;//求0的话把条件改为(a & 1)==0
		//45的二进制是00000000000000000000000000101101
		 //1的二进制是00000000000000000000000000000001
		//按位与&     00000000000000000000000000000001
		a >>= 1;
	}
	printf("其二进制中1的个数为%d\n", count);
}

方法二:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a;
	int count = 0;
	printf("请输入一个数:");
	scanf("%d", &a);//45
	//00000000000000000000000000101101
	//101101 a
	//101100 a-1
	//101100 按位与(消掉了一个1)
	//101100 a
	//101011 a-1
	//101000 按位与(又消掉了一个1)
	while (a)
	{
		a &= (a - 1);
		count++;
	}
	printf("其二进制中1的个数为%d\n", count);//求0则32-count
	return 0;
}

获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	//打印偶数位
	for (i = 31; i >= 1; i -= 2)
	{
		printf("%d ", (n >> i) & 1);
	}
	printf("\n");
	//打印奇数位
	for (i = 30; i >= 0; i -= 2)
	{
		printf("%d ", (n >> i) & 1);
	}
	return 0;
}

写一个函数,判断一个字符串是否由另一个字符串旋转得到

例如:abcdef左旋3个字符得到defabc,判断defabc是否由abcdef旋转得到
方法一:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
	int is_left_move(char*,char*);
	char str1[] = "abcdefg";
	char str2[] = "cdefgab";
	int ret=is_left_move(str1,str2);
	if (ret ==0)
		printf("%s不是由%s旋转得到的\n", str2, str1);
	else
		printf("%s是由%s旋转得到的\n", str2, str1);
	return 0;
}
int is_left_move(char* str1,char* str2)
{
	assert(str1 && str2);
	if (strlen(str1) != strlen(str2))
		return 0;
	char str[20] = { 0 };
	strcpy(str, str1);
	strcat(str, str1);//char str[20]="abcdefgabcdefg";
	if (strstr(str, str2))//if(strstr(str, str2)!=NULL)
		return 1;
	else
		return 0;

}

方法二:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
	int is_left_move(char*, char*);
	char str1[] = "abcdefg";
	char str2[] = "cdesgab";
	int ret = is_left_move(str1, str2);
	if (ret == 0)
		printf("%s不是由%s旋转得到的\n", str2, str1);
	else
		printf("%s是由%s旋转得到的\n", str2, str1);
	return 0;
}
int is_left_move(char* str1, char* str2)
{
	assert(str1 && str2);
	int len = strlen(str1);
	if (strlen(str1) != strlen(str2))
		return 0;
	while (len)
	{
		int i;
		char tmp = *str1;
		//左旋一个字符
		for (i = 0; i < len - 1; i++)
		{
			*(str1 + i) = *(str1 + i + 1);
		}
		*(str1 + len - 1) = tmp;
		if (strcmp(str1, str2)==0)//每左旋一个字符比较一次
			return 1;
		len--;
	}
	return 0;
}

写一个函数,可以实现左旋字符串中的n个字符

例如:abcdef左旋3个字符得到defabc
方法一:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
void left_move(char* str, int n)
{
	assert(str);//断言,保证指针的有效性
	int len = strlen(str);
	char tmp;
	int i;
	while (n)
	{
		//先把第一个字符拿出来,后面的字符向前移动1
		tmp = *str;
		//左旋一个字符
		for (i = 0; i < len - 1; i++)
		{
			*(str + i) = *(str + i + 1);
		}
		*(str + len - 1) = tmp;
		n--;
	}
}
int main()
{
	char str[] = "abcdefg";
	int n = 0;
	printf("请输入左旋个数:");
	scanf("%d",&n);
	left_move(str, n);
	printf("%s\n", str);
	return 0;
}

方法二:
用三步翻转法:
abcdefg(假如左旋三个字符)
cbadefg(先翻转前面三个字符)
cbagfed(再翻转剩下的字符)
defgabc(最后翻转一整个字符串)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>
void reverse(char* left, char* right)
{
	assert(left && right);
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
void left_move(char* str,int n)
{
	assert(str);
	reverse(str, str + n-1);//翻转左边
	reverse(str + n, str + strlen(str) - 1);//翻转右边
	reverse(str, str + strlen(str) - 1);//翻转一整个字符串
}
int main()
{
	char str[] = "abcdefg";
	int n = 0;
	printf("请输入左旋个数:");
	scanf("%d", &n);
	left_move(str, n);
	printf("%s\n", str);
	return 0;
}

有一个数字矩阵,矩阵的每行从左到右时递增的,每列从上到下也是递增的,请编写程序在这样的矩阵中查找某个数字是否存在,如果存在请返回其下标(要求时间复杂度小于o(N))

先写不返回其下标的吧:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int FindNum(int arr[4][4], int row, int col, int k);
	int arr[4][4] = { { 1, 2, 3, 4 },
					  { 5, 6, 7, 8 }, 
					  { 9, 10, 11, 12 }, 
					  { 13, 14, 15, 16 } };
	int row = 4, col = 4;//行=4(行有4行),列=4(列有4列)
	int k = 0;
	printf("Please enter the number you want to find:");
	scanf("%d", &k);
	int ret = FindNum(arr, row, col, k);
	if (ret == 1)
		printf("%d存在\n", k);
	else
		printf("%d不存在\n", k);
	return 0;
}
int FindNum(int arr[4][4], int row, int col, int k)
{
	int x = 0, y = col - 1;//从右上角开始查(也可以从左下角开始查)
	while (x <= row - 1 && y >= 0)
	{
		if (k > arr[x][y])//排除arr[x][y]所在的那一行(因为arr[x][y]最大)
			x++;
		else if (k < arr[x][y])//排除arr[x][y]所在的那一列(因为arr[x][y]最小)
			y--;
		else
			return 1;//找到k

	}
	return 0;//找不到k
}

返回其下标的:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int FindNum(int[4][4], int, int,int*,int*,int);
	int arr[4][4] = { { 1, 2, 3, 4 },
					  { 5, 6, 7, 8 }, 
					  { 9, 10, 11, 12 }, 
					  { 13, 14, 15, 16 } };
	int row = 4, col = 4;//行=4(行有4行),列=4(列有4列)
	int k = 0;
	printf("Please enter the number you want to find:");
	scanf("%d", &k);
	int x = row-1, y =0;
	int ret = FindNum(arr,row,col,&x,&y,k);
	if (ret == 1)
		printf("%d存在,其下标是[%d][%d]\n", k,x,y);
	else
		printf("%d不存在\n", k);
	return 0;
}
int FindNum(int arr[4][4],int row,int col,int* px,int* py,int k)
{
	int x = *px, y = *py;//从左下角开始查
	while (x<= row - 1 && y >= 0)
	{
		
		if (k > arr[x][y])//排除arr[x][y]所在的那一列(因为arr[x][y]最大)
			y++;
		else if (k < arr[x][y])//排除arr[x][y]所在的那一行(因为arr[x][y]最小)
			x--;
		else
		{
			*px = x;
			*py = y;
			return 1;//找到k
		}
	}
	return 0;//找不到k
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值