课程项目3-1 变长数组

变长数组的使用

题目: 编写程序,求⽅程1+x+y=z的解的个数,其中x、y和z满⾜下列条件:
① x和y是⼩于100的质数且x<y,z是⼀个质数
② x和y是⼩于m的质数且x<y,其中m的⼤⼩由⽤户指定。提示:利⽤事先构
造的质数表可以实现空间换时间。如果你的编译器⽀持C99,考虑使⽤变
⻓数组,否则考虑使⽤动态存储分配。

  1. 什么是变长数组
    变长数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,也就是所谓的0长度,所以我们可以用结构体来创建变长数组。
  2. 变长数组的用途
    它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。
  3. 用法
    在一个结构体的最后 ,申明一个长度为空的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们可以进行动态分配,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量。

第一问是第二问的特殊情况,直接上第二问。
代码:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

typedef struct _SoftArray {
	int len;
	int array[];
}SoftArray;

int isPrime(int n);

int main() {
	int len, ind = 0, count = 0, i, j, x, y, z, m;
	printf("Enter the value of m:");
	scanf("%d", &m);
	len = m / 2;
	SoftArray *p = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(int)*len);

	p->len = len;
	for (i = 2; i < m; i++) {
		if (isPrime(i))
			p->array[ind++] = i;
	}

	for (i = 0; i <= ind; i++) {
		for (j = i + 1; j <= ind; j++) {
			x = p->array[i];
			y = p->array[j];
			z = x + y + 1;
			if (isPrime(z)) {
				printf("1 + %d + %d = %d\n", x, y, z);
				count++;
			}			
		}
	}
	printf("There are %d solutions.\n", count);

	free(p);

	return 0;
}

int isPrime(int n) {
	int i, p = 1;
	if (n <= 1) {
		return 0;
	}
	else {
		for (i = 2; i <= sqrt(n); i++) {
			if (n % i == 0)
				p = 0;
		}
	}
	return p;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值