C第5课 之经典100题

一     死循环打印5 

分析: ==判断; =赋值;

​int i = 0;
for (i = 0; i < 10; i++)
{
	if (i = 5)   //赋值而非判断
		printf("%d\n", i);
}

二     求1000到2000之间的闰年并计算个数

分析: 闰年能被4整除且不能被100整除,或能被400整除

int sum = 0;
for (int year = 1000; year <= 2000; year++)
{
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
	{
		printf("%d", year);
		sum++;
	}
}
printf("\n"); printf("sum=%d", sum);

三     求1个数组的最大值

分析:遍历数组,定义一个变量max,拿数组的成员和max比较,如果大于max就赋值给max

int arr[100] = { 1,8,15,2,7,6,7,2,20,14,11 };
int len = sizeof(arr) / sizeof(arr[0]);
int max = 0;
for (int i = 0; i < len; i++)
{
	if (arr[i] > max)
		max = arr[i];
}
printf("max=%d", max);

四     乘法表

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

五     猜数字游戏

分析:随机数

随机数:实际是伪随机数,并不是真正意义上的随机数,根据某种算法生成的随机值;在C语言中,随机种子用到时间戳,引用两个头部文件;

#include <stdlib.h>    #include <time.h>


void Munm()
{
	printf("**************************\n");
	printf("*****   0  quit    *******\n");
	printf("*****   1  game    *******\n");
	printf("**************************\n");
}

void Game()
{
	int num = rand() % 100 + 1;
	int s = 0;
	
	while (1)
	{
		scanf("%d", &s);
		if (s > num)
			printf("输入太大了\n");
		else if (s < num)
			printf("输入太小了\n");
		else
		{
			printf("恭喜你,回答正确\n");
			break;
		}
		
	}

}


int main()
{
	srand((unsigned int)time(NULL));
	int num = 0;
	do
	{
		Munm();
		scanf("%d", &num);
		switch (num)
		{
		case 0:
			printf("结束游戏\n");
			break;
		case 1:
			printf("开始玩游戏啦!\n");
			Game();
			break;
		default:
			printf("输入错误,请重新输入!");
			break;
		}

	} while (num);
	
	
	return 0;
	
}

六     goto跳转语句

分析:goto语句一般用于多层循环跳出,语句不能用中文

 a:
printf("hello");
goto a;
printf("无法执行!");

七     一分钟电脑关机

int aa = 0;
system("shutdown -s -t 60");
printf("please 1 minute after Shutdown ,Enter 1 quxiao ");
scanf("%d", &aa);
if (1 == aa)
	system("shutdown -a");

八    三角形判断

   分析:符合三角形条件:任意两边之和大于第三条边;a+b>c  a+c>b b+c>a
int a, b, c;
	while (scanf("%d %d %d", &a, &b, &c) != EOF)
	{
		if ((a + b) > c && (a + c) > b && (b + c) > a)
		{
			if ((a == b) && (b == c))
				printf("等边三角形\n");
			else if (((a == b) && (b != c)) || ((a == c) && (c != b)) || ((b == c) && (c != a)))
				printf("等腰三角形\n");
			else
				printf("普通三角形\n");
		}
		else
			printf("不是三角形\n");
	}

九   十个数求最大值

分析:不要想着一次性把代码写到位,等遇到问题再解决。设1个最大值max,然后与之比较。
int  arr[10] = { 0 };
for (int i = 0; i < 10; i++)
{
	scanf("%d", &arr[i]);
}
int max = arr[0];
for (int i = 0; i < 10; i++)
{
	if (arr[i] > max)
	{
		max = arr[i];
	}
}
printf("max=%d\n", max);

十   计算1/1-1/2+1/3-1/4+1/5....+1/99-1/100的值,打印出结果

分析:一正一负,除数肯定有小数,因此定义float变量
float sum = 0; int flag = 1;
for (int i = 1; i <= 100; i++)
{
	sum += 1.0 / i* flag;
	flag = -flag; //负负得正
}

printf("%f", sum);

十一  1-100之间有多少个9

分析:一正一负,除数肯定有小数,因此定义float变量
// 求1-100之间有多少个9---------------------------
int sum = 0;
for (int i = 1; i <= 100; i++)
{
	if (i % 10 == 9)  //9 19 29 ...
		sum++;
	if (i / 10 == 9)  //91 92 ... 
		sum++;
}
printf("%d\n", sum); //20

// 求1-100之间有多少个数包含9-----------------------
// 99就包含两个9-----------------------------------
int sum = 0;
for (int i = 1; i <= 100; i++)
{
	if (i % 10 == 9)  //9 19 29 ...
		sum++;
	else if(i / 10 == 9)  //91 92 ... 
		sum++;
}
printf("%d\n", sum); //19   

十二  选择题

定义了一维int 型数组a[10]后,下面说法错误的的引用是:a[10]=2;

a[10]有10个元素,最大下标是9,因此a[10]超出下标越界;

十三  选择题

int arr[] = { 1,2,(3,4),5 };       //(3,4)是逗号表达式,值为4,算作一个元素;
printf("%d\n", sizeof(arr));    //16

十四  选择题

sizeof 求字节数:     '\0'标识符也算是一个字节;

strlen 求字符个数:  如果没有遇到'\0',则会一直向下计算,直到遇到'\0'为止; 

char acX[] = "abcdefg";
char acY[] = { 'a','b','c','d','e','f','g' }; //隐藏了'\0'的结束标识符
// sizeof :求字节数;  strlen:求字符个数
printf("%d %d\n", sizeof(acX), sizeof(acY));  //8 7
printf("%d %d\n", strlen(acX), strlen(acY));  //7 42   strlen 遇'\0'才会停止

char str[] = "hello bit"; //9个字符
printf("%d %d \n", sizeof(str), strlen(str)); //10 9

十五   交换两个数组的值

int arr1[] = { 1,2,3,4,5,6 };
int arr2[] = { 4,5,6,7,8,9 };
int len = sizeof(arr1) / sizeof(arr1[0]);
for (int i = 0; i < len; i++)
{
	int temp = arr1[i];
	arr1[i] = arr2[i];
	arr2[i] = temp;
}

for (int i = 0; i < len; i++)
	printf("%d ", arr1[i]);
printf("\n");
for (int i = 0; i < len; i++)
	printf("%d ", arr2[i]);

十六   打印空心正方形图案

分析:行和列的第一个和最后一个都是*

int a;
	while (scanf("%d",&a)!=EOF)
	{
		for (int i = 0; i < a; i++)
		{
			for (int j = 0; j < a; j++)   
			{ 
				if ((i == 0 || i == a - 1) )     //行第1和和最后一个都是*
					printf("* ");
				else if((j == 0 || j == a - 1))  //列第1和和最后一个都是*
					printf("* ");
				else
					printf("  ");
			}
			printf("\n");
		}
	}

十七  用 * 打印X形图案

分析:行i和列j  i==j 是*    i+j是*

int a;
while (scanf("%d",&a)!=EOF)
{
	for (int i = 0; i <= a; i++)
	{
		for (int j = 0; j <= a; j++)   
		{ 
			if ((i == j || i+j==a) )     //行第1和和最后一个都是*
				printf("* ");
			else
				printf("  ");
		}
		printf("\n");
	}
}

十八  打印斜四边形

 上半部分

下半部分

// 上半部分
int line = 0;
scanf("%d", &line);
for (int i = 0; i < line; i++)
{
	// 打印空格
	for (int j = 0; j < line - 1 - i; j++)
	{
		printf(" ");
	}
	for (int j = 0; j < 2 * i + 1; j++)
	{
		printf("*");
	}

	printf("\n");
}

// 下半部分
for (int i = 1; i < line; i++)
{
	// 打印空格
	for (int j = 0; j < i; j++)
	{
		printf(" ");
	}
	for (int j = 0; j < 2*line-1-i*2; j++)
	{
		printf("*");
	}

	printf("\n");
}

十九  逆序输出

输入10个数,要求按输入时的逆序把这10个数打印出来,逆序输出,就是按照输入相反的顺序打印这10个数; 一行,输入10个整数,用空格分隔;一行,逆序输出输入的10个整数,用空格分隔;

示例:  输入:1 2 3 4 5 6 7 8 9 10

             输出:10 9 8 7 6 5 4 3 2 1

int arr[10] = { 0 };
for (int i = 0; i < 10; i++)
{
	scanf("%d", &arr[i]);
}
for (int i = 9; i >= 0; i--)
{
	printf("%d ", arr[i]);
}

二十    100到200之间有多少个素数

素数又称质数, 只能被1和本身整除的数字;
判断i是否为素数, 如100 则判断2 - 99之间的数能不能除以100
使用2到i-1之间的数字去试除i
如果i被整除了,i就不是素数

int  i = 0; int count = 0;
	for (i = 100; i <= 200; i++)
	{
		int j = 0;
		int flag = 1; //设为真
		for (j = 2; j <= i - 1; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}

		if (flag == 1)
		{
			printf("%d\n", i);
			count++;
		}
	}

	printf("100到200共有 %d 个素数\n", count);

二十一    数组翻转

创建一个整形数组,完成对数组操作;1,实现函数Init()初始化数组全为0;2,实现Print()打印数组的每个元素;3,实现Reverse()函数完成数组元素的逆置。


void Init(int arr[], int len)
{
	for (int i = 0; i < len; i++)
		arr[i] = i;
}
void Print(int arr[], int len)
{
	for (int i = 0; i < len; i++)
		printf("%d ", arr[i]);
	printf("\n");
}
void Reverse(int arr[], int len)
{
	int i = 0; int j = len - 1;
	while (i < j)
	{
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
		i++;
		j--;
	}

}

int main()
{
	int arr[10] = { 0 };
	int len = sizeof(arr) / sizeof(arr[0]);
	Init(arr, len);
	Print(arr, len);
	Reverse(arr, len);
	Print(arr, len);

	return 0;
}

二十二   喝汽水

喝汽水,1瓶汽水1元,2个空瓶子可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)

int money = 20;  //总钱数
int total = money; //初始化,有多少钱就可以喝到多少瓶水
int empty = money; //初始化,有多少钱就可以有多少空瓶子
while (empty>1) //两个空瓶子换一个空瓶子,只有一个瓶子就退出
{
	total += empty / 2; //两个空瓶子换一瓶饮料
	empty = empty / 2 + empty % 2; //5举例,空瓶有2个,另外还剩下一个空瓶子
}
printf("总共喝 %d 瓶饮料\n", total);

二十三   打印水仙花数

求出0~100000之间的所有“水仙花数”并输出。

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。

for (int i = 0; i < 100000; i++)
	{
	     //1,求当前数字i有多少位
		int count = 0;
		int tmp = i;
		while (tmp!=0)
		{
			tmp = tmp / 10;
			count++;  //求得位数保存到count中
		}
		//2,去算每一位
		tmp = i;  //再赋值回来
		int sum = 0;
		while (tmp!=0)
		{
			sum += pow(tmp % 10, count);
			tmp /= 10; //如:153 ..15
		}
		if (sum == i) printf("count位的数字%d\n",i);
	}

二十四   求各项之和

求Sn = a + aa + aaa + aaaa + aaaaa的前5项之和,其中a是一个数字,
例如:2 + 22 + 222 + 2222 + 22222

int a = 0, n = 0;
scanf("%d %d", &a, &n);
int sum = 0;
int tmp = 0;

for (int i = 0; i < n; i++)
{
	tmp = tmp * 10 + a;
	sum += tmp;
}
printf("%d\n", sum);

二十五   打印整数二进制的奇数位和偶数位

void print(int n)
{
	for (int i = 31; i >= 1; i -= 2) //奇数位
	{
		printf("%d ", ((n >> i) & 1));
	}
	printf("\n");
	for (int i = 30; i >= 0; i -= 2) //偶数位
	{
		printf("%d ", ((n >> i) & 1));
	}
}

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

二十六   两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

void print(int n,int m)
{
	int ret = n ^ m;
	int count = 0;
	while (ret!=0)
	{
		ret = ret & (ret - 1); //如果出现0就跳出了,方法很妙
        count++;
	}
	printf("m和n中二进制不同的个数%d\n", count);
}

int main()  //指针写法
{
	print(2, 30);
	return  0;
}

二十七  字符串左转

题目内容:实现一个函数,可以左转字符串中K个字符。

例如:

ABCD左转一个字符得到BCDA

ABCD左转两个字符得到CDAB

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>  //包含一个输入输出的文件
#include <string.h> 

void leftRound(char* str, int k)
{
	int len = strlen(str);
	int time = k % len; //挪动几个就是余数字符串长度
	for (int i = 0; i < time; i++)
	{
		char tmp = str[0]; //先存下第一个
		int j = 0;
		for (j = 0; j < len - 1; j++)
		{
			//后面覆盖到前面,挪动3次
			str[j] = str[j + 1];
		}
		str[j] = tmp;
	}
}

int main()
{
	char str[] = "ABCD";
	leftRound(str, 5);
	printf("%s\n", str);
	return 0;
}

  方法二用字符串库函数

void leftRound(char* str,size_t k)
{
	int len = strlen(str);
	int time = k % len;
	char tmp[256] = { 0 };
	strcpy(tmp, str + time); //str是首元素地址;
	strncat(tmp, str, time); //拼接字符串
	strcpy(str, tmp); //再放回str字符串中
}

int main()
{
	char str[] = "ABCD";
	int len = strlen(str);
	leftRound(str,2);
	printf("%s", str);
	return 0;
}

方法三 内部逆序算法


void Reverse(char*str,int left,int right)
{
	while (left<right)
	{
		/*char tmp = str[left];  //常规写法
		str[left] = str[right];
		str[right] = tmp;*/
		char tmp = *(str + left);  //指针写法
		*(str + left) = *(str + right);
		*(str + right) = tmp;
		left++; //往后走
		right--;//往前走
	}
}

int main()
{
	char str[] = "ABCD";
	int len = strlen(str);
	int k = 9;
	int time = k % len;
	Reverse(str, 0, time - 1);     //执行三次
	Reverse(str, time, len - 1);
	Reverse(str, 0, len - 1);
	printf("%s", str);
	return 0;
}

二十八  调整数组使奇数全部都位于偶数前面

输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分

1.22

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值