学习笔记12:Eratosthenes筛选法求素数(100以内) 和 魔方阵

Eratosthenes筛选法求素数与魔方阵

Eratosthenes筛选法求素数(100以内)
step1:将1挖去
step2:将2除以2之后的数,凡是能被2整除的数(即2的倍数)都挖去
step3:用3,4,…除以之后的数,循环往复。
tips:找1-n的素数,只需要进行到除数为根号n即可

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

int main()
{
	int i, j, cnt = 0;
	int a[100];
	for ( i = 1; i <= 100; i++)
	{
		a[i -1] = i;//赋值1-100
	}
	a[0] = 0;//挖去1
	for ( i = 1; i < (int)sqrt(100); i++)//除数
	{
		for (j = i+1; j < 100; j++)//遍历3-100
		{
			if (a[i]!=0&&a[j]!=0)
			{
				if (0==a[j]%a[i])
				{
					a[j] = 0;
				}
			}
		}
	}
	for ( i = 1; i < 100; i++)
	{
		if (a[i] != 0)
		{
			printf("%5d", a[i]);
			cnt++;
		}
		if (0 == cnt % 10)
		{
			printf("\n");
		}
	}
	printf("\n");
	system("pause");
	return 0;
}

魔方阵
形如:
8 1 6
3 5 7
4 9 2
每一行,每一列,每个对角线之和都相等的方阵称为魔方阵,要求输出1–n^2数的魔方阵

分析:
case1:数1处于第一行的中间位置
case2:后一个数字处于前一个数字的上一行右一列,如4处于第三行第一列,则5就处于第二行,第二列
case3:如果该数字处于第一行则转移至最后一行,列的规律相同,如8处于第一行第一列,则9处于第三行第二列。
如果该数字处于最后一列(第n行),列转移至第一列,行规律相同,如2处于第三行第三列,则3就处于第二行(3-1)第一列。
case4:如果该数字处于第一行的最后一列,如:6处于第一行的最后一列,则7就位于6的下方;
如果该数字的上一行右一列存在数字,如3的上一行右一列已经存在1了,则4就放置在3的下一行,列不变

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


int main()
{
	int i=0, j, k, n;
	int a[15][15] = { 0 };//数组初始化
	//printf("请输入阶数n:  (阶数为1-15以内的奇数)\n");
	//scanf("%d", &n);
	n = 3;//测试用
	for ( i = 1; i <= n; i++)
	{
		for (j = 1; j<= n; j++)
		{
			a[i][j] = 0;
		}
	}
	//魔方阵
	//1放在第一行的中间一列
	j = n / 2 + 1;
	a[1][j] = 1;
	for ( k = 2; k <= n*n; k++)
	{
		i = i - 1;//上一行
		j = j + 1;//后一列
		
		if (i<1&&j>n)//第一行第n列,则列不变 行+1
		{
			i = i + 2;
			j = j - 1;
		}
		else
		{
			if (i < 1)//第一行则换行至最后一行
			{
				i = n;
			}
			if (j > n)//最后一列则换列至第一列
			{
				j = 1;
			}
		}
		if (0==a[i][j])//所处位置未填数则填数
		{
			a[i][j] = k;
		}
		else//已有数则放在上一个数下面
		{
			i = i + 2;
			j = j - 1;
			a[i][j] = k;
		}
	}
	for ( i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			printf("%3d",a[i][j]);
		}
		printf("\n");
	}
	system("pause");
	return 0;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值