谭浩强课后题(数组篇)

用筛法求素数

代码:

#include<stdio.h>
#include<string.h>
#define N 110
int prime[N];


void primes()
{
	memset(prime, 1, sizeof(prime));
	prime[0] = prime[1] = 0;
	for (int i = 2; i < N; ++i)
	{
		if (prime[i])
			for (int j = 2 * i; j < N; j += i)
				prime[j] = 0;
	}
}

int main()
{
	primes();
	for (int i = 1; i <= 100; ++i)
		if (prime[i])
			printf("%d ", i);
	return 0;
}

冒泡排序

冒泡排序


#include <string.h>
#include <malloc.h>
#include <stdio.h>
#include <math.h>

#define maxn 1000

void swap(int* x, int* y) //交换元素
{
	int tem;
	tem = *x;
	*x = *y;
	*y = tem;
}

void show(int* arr, int n)
{
	for (int i = 0; i < n; i++)
		printf_s("%d  ", arr[i]);
	printf_s("\n");
}

void selectsort(int* arr, int key, int n)
{
	// 1 是升序,0是降序
	int m;//中间得过渡标记
	if (key)//升序
	{
		for (int i = 0; i < n - 1; i++)//只用比较n-1次
		{
			m = i; //如第一次选好最小后,最小的位置就不能动了,所以用接下来的一位来比较选出次小的,m作用是标记住所需要的元素的位置
			for (int j = i + 1; j < n; j++)
				if (arr[j] < arr[m])//从比较的位置后一个开始
					m = j;//,如果后边的位置小,因为m要选小的,所以m更新
			if (m != i)//当后边有比前边的值小时再交换
				swap(&arr[i], &arr[m]);
			show(arr, n);
		}
	}

	else//降序
	{
		for (int i = 0; i < n - 1; i++)
		{
			m = i;
			for (int j = i + 1; j < n; j++)
				if (arr[j] > arr[m])
					m = j;
			if (m != i)
				swap(&arr[i], &arr[m]);
			show(arr, n);
		}
	}
}
int main()
{
	int arr[maxn] = {};//默认初始化
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf_s("%d", &arr[i]);
	//BubbleSort(arr, 1,n);
	selectsort(arr, 1, n);
	return 0;
}


逆序存放数组元素

这里的方法是:双指针
代码:

#include<stdio.h>
#include<string.h>
#define N 1000
int prime[N];
int a[N];

void swap(int* x, int* y) //交换元素
{
	int tem;
	tem = *x;
	*x = *y;
	*y = tem;
}
int main()
{
	int n;
	scanf_s("%d", &n);
	for(int i=0;i<n;++i)
		scanf_s("%d", &a[i]);
	int left = 0, right = n - 1;
	while (left <= right)
		swap(&a[left++], &a[right--]);
	for (int i = 0; i < n; ++i)
		printf("%d ", a[i]);
	return 0;
}

奇数阶魔方

题目
 魔方是n x n 的矩阵,每个单元取整数值,范围从1到n2 ,要求每行每列,以及两条对角线的和都相等。下图所示为 n = 5 的魔方,相等的和数是65。

在这里插入图片描述
问题分析
不难发现:

  • (1)由于是正规魔方,故填入的 n2 个不同整数依次为1,2,3,….n°。
  • (2)各行、列和对角线上的数字虽各不相同,但其和却是相同的。这表明,其魔方常数可由公式 n(n2+1)/2 得到。
  • (3)数字在阵列中的次序并没有遵从阵列单元的行、列下标的顺序,但数字1却始终出现在阵列第一行的正中间位置,而数字 n2 也始终出现在阵列第n行的正中间位置,这说明阵列中的数字排列是有一定规律的。

规律

  • (1)自然数1出现在第一行的正中间。

  • (2)若填入的数字在第一行(不在第n列),则下一个数字在第n行(最后一行),且列数加1(列数右移一列)。

  • (3)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧。

  • (4)一般地,下一个数字在前一个数字的右上方(行数少 1,列数加1)。

  • (5)若应填的地方已经有数字或在方阵外,则下一个数字就填在前一个数字的下方(一般地,n的倍数的下一个数字在该数的下方)。

代码:

#include<stdio.h>
#include<strinh.h>

int main()
{
int u;
int x,y,n,i,j;
int num[22][22];
scanf("%d",&u);
while(u--)
{
scanf("%d",&n);
memset(num,-1,sizeof(num));
x = 1;   
y = n/2 +1;
for(i=1;i<=n;++i)
{
num[x][y] = i;
x--;  // 依次斜上
y++;
if(x==0&&y==n+1)
{
x +=2;
y--;
}
else if(num[x][y]!=-1)
{
x+=2;
y--;
}
else if(x==0&&y!=n+1)
{
x=n;
}
else if(x!=0&&y==n+1)
{
y=1;
}
}
//输出 ,这个就不用我写了把
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值