猜数字游戏 | 判断闰年 | 判断素数 | 打印99乘法口诀表 | 求两数最大公约数(遍历法)| 详解 | C语言

目录

一.判断闰年

   二.计算分式1/1-1/2+1/3+...+1/99-1/100

三.判断素数

四.求两数最大公约数

五.打印99乘法口诀表

六.猜数字游戏


一.判断闰年

闰年成立条件:

1,可被4整除,但不能被100整除

扫描二维码关注公众号,回复: 17354253 查看本文章

2.可被400整除

以上2条满足其一则为闰年               

#define _CRT_SECURE_NO_WARNINGS 1
//打印1000年到2000年之间的闰年
#include<stdio.h>
int main()//闰年成立条件:1.能被400整除
                        //2.能被4整除,但不能被100整除
{
	int year = 0;
	for (year = 1000; year <= 2000; year++)
	{
		if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
		{
			printf("%5d", year);//控制域宽(最小宽度)为5,向右对齐
		}
	}


	return 0;
}

   二.计算分式1/1-1/2+1/3+...+1/99-1/100

观察规律:

1,偶数项为负数,奇数项为正数

2.分母递增,分子为1|-1交替出现

#define _CRT_SECURE_NO_WARNINGS 1
//计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值
// 打印出结果
#include<stdio.h>
int main()
{//规律:奇数分母时符号为正,偶数分母时符号为负。
	//方法2
	double sum = 0.0;
	int i = 0;
	int flag = 1;
	for (i = 1; i <= 100; i++)
	{
		sum = sum + (flag * 1.0) / i;//分子、分母上有一个浮点数,则结果就为浮点数。
		flag = -flag;//往复变号(1|-1)。
	}
	printf("%f\n", sum);
	return 0;
}
//方法一
//int i = 0;
//double sum = 0.0;
//for (i = 1; i <= 100; i++)
//{
//	if (i % 2 == 0)//如果i为偶数,则符号为负
//	{
//		sum = sum - 1.0 / i;
//	}
//	else//如果i为奇数,则符号为正
//	{
//		sum = sum + 1.0 / i;
//	}
//	//!!!!!sum累加
//}
printf("%f", sum);

三.判断素数

素数(又称质数):只能被1和它本身整除

方法:

1.试除法:设被判断数为x,定义一个变量i,并使i从2开始递增,i=x-1为止。如果x被2~x-1这之间任一数整除,则x就不是素数。反之,x就是素数。

2.优化:容易知道,除了2以外,所有的偶数都是素数,因此判断时可以跳过每一个偶数(除了2).

3.再优化:引用头文件<math.h>,调用sqrt()(求平方根函数,且默认值为浮点数。因此若要使开出来的数是整数,则要进行强制类型转换,即(int)sqrt(x))

如果i能够被[2, sqrt(i)]之间的任意数据整除,则i不是素数
原因:如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于sqrt(m),另一个大于或等于 sqrt(m)。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
//思路:100~200之间的偶数都不是素数,因此可以直接跳过
//从3开始整除x,如果3~x-1之间有一个数可以整除x,那么x就不是素数
//如果i能够被[2, sqrt(i)]之间的任意数据整除,则i不是素数
//原因:如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于sqrt(m),另一个大 
   //于或等于 sqrt(m)。







int main()
{
	int i = 0;
	int count = 0;


	for(i=101; i<=200; i++)
	{
		//判断i是否为素数
		//2->i-1
		int j = 0;
		for(j=2; j<=sqrt(i); j++)
		{
			if(i%j == 0)
			{
				break;
			}
		}
		//...
		if(j>sqrt(i))
		{
			count++;
			printf("%d ", i);
		}
	}


	printf("\ncount = %d\n", count);
	return 0;
}


四.求两数最大公约数

两数最大公约数:能同时整除两数的最大的数,即为两数最大公约数

方法:

1.试除法:设x,y两数。并定义变量min,交换输入的x,y两数,以此保证x永远是较小数。

定义变量i:for循环初始化i=x,并使i递减。在i递减过程中若碰到一个数可以同时整除x,y。那么此数即为x,y的最大公约数,这时就不用判断接下来的数了,利用break直接跳出循环。

若i==1时x,y仍没有被整除,那么x,y就没有最大公约数。

#define _CRT_SECURE_NO_WARNINGS 1//求两数最大公约数
#include<stdio.h>
//思路:1.两数最大公约数一定小于它们中的最小数
      //2.试除法,即从两数中的最小一数开始除起(往小了除),如果遇见一个数可以同时整除两数,此数即为最大公约数
int main()
{
	int x = 0;
	int y = 0;
	while (scanf("%d%d", &x, &y) == 2)
	{
		if (x > y)
		{
			int min = 0;//声明1个变量,用于交换x,y两数,保证x永远是最小数
			min = y;
			y = x;
			x = min;
		}
		int i = 0;//声明一个变量i,用于试除x,y两数
		for (i = x; i <= x; i--)//从较小数x开始除起
		{
			if (i == 1)
			{
				printf("x与y没有公约数\n");
				break;
			}
			if (x % i == 0 && y % i == 0)
			{
				
				printf("%d是x与y的最大公约数\n", i);
				break;
			}
			
			
		}


	}



	return 0;
}

五.打印99乘法口诀表

定义i,j。两层for循环,外层循环行,里层循环列。并使每一行的列数小于等于它所在的行数。

#define _CRT_SECURE_NO_WARNINGS 1//打印99乘法口诀表
#include<stdio.h>
int main()
{
	int i = 0;//控制行数
	int j = 0;//控制列数
	for (i = 1; i <= 9; i++)//外层循环,控制行数
	{
		for (j = 1; j <= i; j++)//里层循环,控制行数
		{
			int x = i * j;
			printf("%d*%d=%2d  ", i, j, x);
		}
		printf("\n");//控制打印一行后换行
	}



	return 0;
}

六.猜数字游戏

1.使用rand函数,srand函数引头文件<stdlib.h>

rand函数与srand函数必须同时使用,缺一不可。

rand函数生成随机数,srand函数生成种子。并且rand函数依托srand函数所生成的种子来生成随机数(即种子不断变化,随机数也不断变化)而如果种子保持不变的话,你就会发现上次rand函数所生成的随机数和这次一模一样。需要注意的是这里生成的随机数是伪随机数,并不是真正的随机数

2.使用time函数,引头文件<time.h>

接上文,而想要得到不断变化的种子,那么这是就要用到time函数。通过利用不断变化的时间戳,来使种子不断变化,并以此来生成不断变化的伪随机数。

3.让rand函数产生一定范围内的伪随机数

rand函数产生的伪随机数的范围:0~32767

产生一定范围内的数方法:int ret=rand()%(b-a+1)即产生(a,b)范围内的伪随机数。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//srand和rand 在c中头文件是  <stdlib.h>

//time(0)的头文件是 <time.h>
//
//在c++中在头文件是<cstdlib>
//
//注意srand和rand 一起用才能得到真正的随机数
//
//解释如下
//
//rand是生成随机数列
//
//但是我们会发现再次运行的时候rand生成的随机数列跟上次一样
//
//所以我们需要用srand(time(0))清空
//
//事实上这个叫设置种子,如果你设置的是一个常量的种子当你再次运行时得到的依旧是上一次的随机数
//
//解决方法是设一个变量种子就好比如time(0)获取系统时间的秒数,从而产生变量的种子,生成大的随机数列也跟着改变,也就是某种意义上的随机数列了
void menu()//void空函数不要求返回值
{
	printf("*****猜数字游戏*****\n");
	printf("***输入1则开始游戏***\n");
	printf("***输入0则退出游戏***\n");
}//游戏初始菜单
void game()//游戏函数,开始设置游戏内容
{
	int y = 0;//玩家猜的数字
	srand(time(NULL));
	int ret = 1+rand() % (100 - 1 + 1);
	//让rand函数产生1~100之间的数  //a+rand()%(b-a+1)产生(a,b)之间的数  	  //rand产生随机数的范围0~32767
	//rand和srand一起使用才能够真正的生成随机数
	//srand用于设置种子,rand用于生成随机数
	//rand依托srand所提供的种子来生成随机数
	//如果srand所设置的种子是常量,那么rand生成的随机数并不会时刻改变。而要使种子不断改变,这时就要用到time函数(时间戳)

	
	

	
	while (1)
	{
		int i = 0;//限定猜测的次数
		for (i = 5; i >=0; i--)
		{
			printf("您还剩余%d次机会.\n", i);
			if (i == 0)
			{
				printf("您的机会使用完了.\n");
				break;//跳出for循环,进入while循环中
			}
			scanf("%d", &y);
			if (y > ret)
			{
				printf("猜大了\n");
			}
			else if (y < ret)
			{
				printf("猜小了\n");
			}
			else
			{
				printf("猜对了\n");
				break;//跳出for循环,进入while循环中
			}
		}
		break;//跳出while循环,进入主函数中,判断用户输入1还是0,即是否继续进行游戏
	}
}
int main()
{
	
	int input = 0;
	
	do
	{
		menu();//设置菜单
		scanf("%d", &input);//等待玩家输入
		if (input == 1)
		{
			printf("开始游戏了,请输入您要猜的数字.\n");
		}
		if (input == 0)
		{
			printf("您已退出游戏.\n");
		}
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("请输入1或0\n");
			break;
		}
	} while (input);
	return 0;
}


	

感谢各位阅读!

猜你喜欢

转载自blog.csdn.net/nmbg11/article/details/134737926