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;
}