C语言程序设计(二)

四.找素数

素数:除了1和它本身不再有其他因数的自然数。换句话说:一个大于1的自然数 ,如果只能被1和它本身整除,那就是素数(质数)。

在打印中遇到的问题就是,知道怎么写却总是运行不起来。主要有这两个问题:

1.每判断一个数是否是素数后都需要对flag进行初始化,否则flag一直都是1。

2.打印素数需要在外层循环里面,每判断一次就打印一次(是素数则打印,不是则不打印)。

复制代码
int main()
{
	int i = 0;
	int j = 0;
	int flag = 0;//声明一个flag
	for (i = 100; i <= 200; i++)
	{
		flag = 0;//每次判断素数后需要初始化
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 1;//用1代表不是素数的自然数
				break;
			} 
		}
		if (flag == 0)
		{
			printf("%d是素数\n", i);//0则代表的是素数
		}
	}
	return 0;
}

五.最小公倍数以及最大公约数

最大公约数:两个或多个整数共有的最大的那个正整数约数。例:(12,18)->36

基本办法(穷举法):找两个数小的那个,然后依次减一,其中判断i是否既能被m整除又能被n整除,满足则最大公约数就i,接着跳出循环。

复制代码
int main()
{
	int m = 0;
	int n = 0;
	int i = 0;
	scanf("%d %d", &m, &n);
	int min = m > n ? n : m;
	for (i = min; i >=1 ; i--)
	{
		if (m % i == 0 && n % i == 0)
		{
			printf("%d是最大公约数\n", i);
			break;
		}
	}
	return 0;
}

辗转相除法 :输入两个数m和n,m对n求余。m%n如果等于0,则最大公约数为n;若不等于0,将原先的n赋值给m,求得的余数赋值给n,再进行求余,循环终止条件则是求余为0。

复制代码
int main()
{
	int m = 0;
	int n = 0;
	int temp = 0;
	int t = 0;
	scanf("%d %d", &m, &n);
	while (m % n)//循环终止条件
	{
		temp = m % n;
		m = n;
		n = temp;
	}
	printf("%d是最大公约数\n", n);
	return 0;
}
最小公倍数:两个或多个整数的公倍数里最小的那一个。例:(12,18)->6

通过计算两个或多个数之积,再除以它们的最大公约数(辗转相除法计算),求最小公倍数有很多种方法(也可以通过找两个数或多个数最大的,判断是否可以除尽其它数,不能则++直至找到能除尽的那个数)。

复制代码
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int max = a * b;
	int k = 0;
	while (a % b)//辗转相除法
	{
		k = a % b;
		a = b;
		b = k;
	}
	printf("%d\n", max / b);
	return 0;
}

六.字符串逆序

题目意思是最后打印的数组呈现出来的就是倒序的样子,而非倒序打印。要倒序打印数组,需要将第一个字符与最后一个字符交换(交换时需要第三方),第二个字符与倒数第二个字符交换,两端一直向中间汇聚,直到字符剩一个或两个。

从第一次函数来说吧!先是'w'与'!'交换需要中间变量temp,改变数组得用上指针,指针找'!'需要知道字符串的长度*(string+len-1),将'!'赋值给*string,再将'\0'赋值给最后一个字符(这里赋值的原因是为了调用下一次函数时,计算剩下字符串的长度(除'w''和!'),因为字符串结束标志是'\0'。假使不赋值'\0',计算长度时会多加'!',等到下次赋值时就是将'!'给'e',这样就得不到想要的倒叙。)。递归重点来啦:不断重复以上操作,直至所剩的字符长度小于2,假设为1的话最后这个字符不需要交换且没有字符与之交换,这就成为这个题目递归的限制条件。最后再将temp的字符给*(string+len-1)。这样就好啦!

复制代码
int Strlen(char *str)
{
	int count = 0;
	while (*str!='\0')
	{
		count++;
		str++;
	}
	return count;
}

void reverse_string(char* string)
{
	int len = Strlen(string);
	char temp = *string;//交换头和尾字符
	*string = *(string + len - 1);
	*(string + len - 1) = '\0';//为了下一次递归头和尾相呼应
	if (Strlen(string + 1) >= 2)    //结束递归的条件向两端汇聚,当只剩一个字符则不需要交换
	{
		reverse_string(string + 1);//调用不需要指针*
	}
	*(string + len - 1) = temp;
}

int main()
{
	char arr[] = "welcome to my world!!!";
	//int sz = sizeof(arr) / sizeof(arr[0]);
	//int len = strlen(arr);
	//printf("%d\n", sz);//23  写这个是为了测试sizeof和strlen计算字符串个数的区别
	//printf("%d\n", len);//22
	reverse_string(arr);
	printf("%s\n", arr);
	return 0;
}

这里再讲一个小知识:sizeof计算字符时会计算'\0',而strlen函数不计算它。

相关推荐
看到我,请让我去学习19 分钟前
OpenCV编程- (图像基础处理:噪声、滤波、直方图与边缘检测)
c语言·c++·人工智能·opencv·计算机视觉
倔强的小石头_2 小时前
【C语言指南】函数指针深度解析
java·c语言·算法
jz_ddk8 小时前
[学习] C语言数学库函数背后的故事:`double erf(double x)`
c语言·开发语言·学习
无小道10 小时前
c++-引用(包括完美转发,移动构造,万能引用)
c语言·开发语言·汇编·c++
FirstFrost --sy11 小时前
数据结构之二叉树
c语言·数据结构·c++·算法·链表·深度优先·广度优先
森焱森11 小时前
垂起固定翼无人机介绍
c语言·单片机·算法·架构·无人机
秋说13 小时前
【PTA数据结构 | C语言版】两枚硬币
c语言·数据结构·算法
☆璇14 小时前
【数据结构】栈和队列
c语言·数据结构
Heartoxx16 小时前
c语言-指针与一维数组
c语言·开发语言·算法
秋说18 小时前
【PTA数据结构 | C语言版】将数组中元素反转存放
c语言·数据结构·算法