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函数不计算它。

相关推荐
重生之我在20年代敲代码3 小时前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
2401_858286116 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
jiao000017 小时前
数据结构——队列
c语言·数据结构·算法
铁匠匠匠7 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
C-SDN花园GGbond7 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
Navigator_Z9 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
菜菜想进步10 小时前
内存管理(C++版)
c语言·开发语言·c++
知星小度S10 小时前
C语言——自定义类型
c语言·开发语言
cleveryuoyuo10 小时前
二叉树的链式结构和递归程序的递归流程图
c语言·数据结构·流程图
科研小白_d.s10 小时前
vscode配置c/c++环境
c语言·c++·vscode