初学者常见的几类编写程序问题

1、求n的阶乘,1! + 2! + 3! +.....+n!

解题思路:看到从1!递增到n!之和,首先要想到至少需要一个循环,由于是每个数的阶乘,可能需要循环里面再嵌套一个循环。但是要有其他方法代替循环的嵌套,就尽量不要用循环的嵌套,因为循环的嵌套会增加时间复杂度。

#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	int a = 1;
	int n = 0;
	int sum = 0;
	scanf("%d", &n);//输入你想要求到的阶乘

	for (i = 1; i <= n; i++)//求各个数阶乘的后之和
	{
		a = 1;
		for (j = 1; j <= i; j++)//求一个数的阶乘
		{
			a *= j;//等同于 a = a * j;
		}
		sum += a;//等同于 sum = sum + a;
	}
	printf("%d\n", sum);

	return 0;
}

优化:

#include<stdio.h>
int main()
{
	int a = 1;
	int m = 0;
	int sum = 0;
	int n = 0;
	scanf("%d", &n);
	for (m = 1; m <= n; m++)
	{
		a *= m;
		sum += a;
	}
	printf("%d\n", sum);

	return 0;
}

2、任意输入三个数,但三个数从大到小输出

解题思路:首先我们得创建三个变量了,分别用来存储最大值、中间值和最小值,然后让它们依次输出。互换两个数的值,需要借助第三个变量来交换,类似于交换两个装满水的杯子,需要借助第三个空杯子来交换。

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	//输入
	scanf("%d %d %d", &a, &b, &c);//输入第一个数后用空格隔开继续输入第二个数
	//最大值放在a中,最小值放在c中
	//a和b的较大值放在a中
	if (a < b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}
	//把a和c中较大的值放在a中
	if (a < c)
	{
		int tmp = a;
		a = c;
		c = tmp;
	}
	//把b和c中较大的值放在b中
	if (b < c)
	{
		int tmp = b;
		b = c;
		c = tmp;
	}
	//输出
	printf("%d %d %d\n", a, b, c);	
	return 0;
}

3、打印1到100之间3的倍数。

解题思路: 能被3整除的就是3的倍数。需要一个循环再加一个判断语句。

#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 100; i++)
	{
		//判断i是否是3的倍数
		if (i % 3 == 0)
		{
			printf("%d\n", i);
		}
	}
	return 0;
}

4、输入两个数,求它们的最大公约数。

解题思路:两个数的最大公约数不管怎么样都不会超过两个数中较小的那一个数。

方法一: 

#include<stdio.h>
int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	//求最大公约数
	int ret = 0;
	//1.求m和n的较小值,假设就是最大公约数
	if (m > n)
	{
		ret = n;
	}
	else
	{
		ret = m;
	}

	while (1)
	{
		if (m % ret == 0 && n % ret == 0)
			break;
		ret--;
	}
	//打印
	printf("%d\n", ret);
	return;
}

 方法二:辗转相除法(更优)

#include<stdio.h>
int main()
{
	int m = 0;
	int n = 0;
	int ret = 0;
	scanf("%d %d", &m, &n);
	while (ret = m % n)
	{
		m = n;
		n = ret;
	}
	printf("%d\n", n);
	return 0;
}

 5、打印1000到2000之间的闰年

解题思路:闰年的判断规则:①能被4整除,并且不能被100整除;②能被400整除的。满足以上的某一个条件,都是闰年。

#include<stdio.h>
int main()
{
	int y = 0;
	int count = 0;
	for (y = 1000; y <= 2000; y++)
	{
		//判断y是不是闰年
		if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))// &&是表示并且,||表示或
		{
			count++;//计算闰年的个数
			printf("%d ", y);
		}
	}
	//输出个数
	printf("\ncount = %d\n", count);

	return 0;
}

 如果上述代码理解起来比较绕,可能一下代码更便于理解。

#include<stdio.h>
int main()
{
	int y = 0;
	int count = 0;
	for (y = 1000; y <= 2000; y++)
	{
		//判断y是不是闰年
		if (y % 4 == 0 && y % 100 != 0)
		{
			count++;//计算闰年的个数
			printf("%d ", y);
		}
		if (y % 400 == 0)
		{
			count++;//计算闰年的个数
			printf("%d ", y);
		}

	}
	//输出个数
	printf("\ncount = %d\n", count);

	return 0;
}

 6、打印100到200之间的素数。

解题思路:素数也叫质数,只能被1和它本身整除的数字就是素数

#include<stdio.h>
int main()
{
	int y = 0;
	int count = 0;
	for (y = 100; y <= 200; y++)
	{
		//判断y是不是素数
		//拿2到y-1的数字去试除y就行
		int n = 0;
		int flat = 1;//假设y是素数
		for (n = 2; n < y; n++)
		{
			if (y % n == 0)
			{
				flat = 0;//不是素数
				break;
			}
		}
		if (flat == 1)
		{
			printf("%d ", y);
			count++;//计算素数的个数
		}
	}
	printf("\ncount = %d\n", count);
	
	return 0;
}

优化: 假如判断一个数y是不是素数,从2开始循环到y的开平方根就可以了。

#include<stdio.h>
#include<math.h>//使用sqrt()函数需要的头文件
int main()
{
	int y = 0;
	int count = 0;
	for (y = 101; y <= 200; y+=2)
	{
		//判断y是不是素数
		//拿2 到 y-1的数字去试除y就行
		int n = 0;
		int flat = 1;//假设y是素数
		for (n = 2; n < sqrt(y); n++)//sqrt(y)表示y的开平方根
		{
			if (y % n == 0)
			{
				flat = 0;//不是素数
				break;
			}
		}
		if (flat == 1)
		{
			printf("%d ", y);
			count++;//计算素数的个数
		}
	}
	printf("\ncount = %d\n", count);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值