基于 asymptote 的一个回答:
settings.outformat="pdf";
unitsize(1cm);
import primetable;
int nums=100; int cols=10; real dx=1; real dy=0.6;
markPrimeTable(nums,cols,dx,dy,lineMarkers);
newpage();
markPrimeTable(nums,cols,dx,dy,ploymarkers(getPrimeFactors(nums).length));
newpage();
labelPrimeTable(nums,cols,dx,dy,randrgbs(getPrimeFactors(nums).length));


还可以:
settings.outformat="pdf";
unitsize(1cm);
import primetable;
int nums=1000; int cols=50; real dx=1; real dy=0.6;
// markPrimeTable(nums,cols,dx,dy,lineMarkers);
// newpage();
markPrimeTable(nums,cols,dx,dy,ploymarkers(getPrimeFactors(nums).length));
newpage();
labelPrimeTable(nums,cols,dx,dy,randrgbs(getPrimeFactors(nums).length));

primetable.asy 如下
private from math access grid;
/*======== 画笔/标注 =========*/
pen[] randrgbs(int n) {
return sequence(new pen(int){return rgb(unitrand(),unitrand(),unitrand());},n);
}
pen NWLine(real angle=45, real xscale=0.5, real yscale=10) {
return makepen(rotate(angle)*scale(xscale,yscale)*polygon(4));
}
pen NELine(real angle=-45, real xscale=0.5, real yscale=10) {
return makepen(rotate(angle)*scale(xscale,yscale)*polygon(4));
}
pen NWNELine(real angle=45, real xscale=0.5, real yscale=10) {
path NWLine=rotate(angle)*scale(xscale,yscale)*polygon(4);
path NELine=rotate(-angle)*scale(xscale,yscale)*polygon(4);
real[][] inters=intersections(NWLine,NELine);
path p=subpath(NELine,inters[1][1],inters[0][1]);
real[][] inters=intersections(NELine,NWLine);
path q=subpath(NWLine,inters[2][1],inters[3][1]);
return makepen(buildcycle(p,q,rotate(180)*p,rotate(180)*q));
}
pen HLine(real xscale=0.5, real yscale=10) {
return makepen(rotate(90)*scale(xscale,yscale)*polygon(4));
}
pen ploypen(int N, real angle=0, real xscale=1, real yscale=1) {
return makepen(rotate(angle)*scale(xscale,yscale)*polygon(N));
}
pen NWLine=NWLine();
pen NELine=NELine();
pen NWNELine=NWNELine();
pen HLine=HLine();
pen[] lineMarkers=new pen[] {NELine,NWLine,NWNELine,HLine};
pen[] ploymarkers(int n, real scalefactor=6) {
return sequence(new pen(int i) {return scale(scalefactor)*ploypen(i+3)+opacity(0.4);},n);
}
/*======== 素数判断 =========*/
// 判断是否是素数
bool isPrime(int n) {
if (n <= 1) { return false; }
else if ( n == 2) { return true; }
else if ( n % 2 == 0 ) { return false; }
else {
for (int i=3; i<= ceil(sqrt(n)); i+=2) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
// 素因子
int[] getPrimeFactors(int n) {
int[] op;
for (int i=1; i<=ceil(sqrt(n)); ++i) {
if (isPrime(i)) { op.push(i); }
}
return op;
}
/*======== 标记/标注表格 =========*/
// 标注数字
void labelnumber(int i, int cols, real dx, real dy, pen p=currentpen) {
label("$"+(string)i+"$",scale(dx,dy)*((i-1) % cols, -quotient(i-1,cols)),p);
}
// 标记数字
void marknumber(int i, int cols, real dx, real dy, pen p=currentpen) {
draw("$"+(string)i+"$",scale(dx,dy)*((i-1) % cols, -quotient(i-1,cols)),p);
}
// 绘制表格
void drawTable(int nums, int cols, real dx, real dy) {
int rows=ceil(nums/cols);
add(shift(0,-rows*dy)*shift(-0.5dx,0.5dy)*scale(dx,dy)*grid(cols,rows));
}
// 标注素数表格
void markPrimeTable(int nums, int cols, real dx, real dy, pen[] pens) {
int[] primes=getPrimeFactors(nums);
drawTable(nums,cols,dx,dy);
for (int i=2; i<=nums; ++i) {
bool[] b=sequence(new bool(int j) {return i % primes[j] ==0; }, primes.length);
int j=find(b);
if (j == -1) {
marknumber(i,cols,dx,dy,linewidth(0));
} else {
marknumber(i,cols,dx,dy,(i == primes[j] ? nullpen : pens[j]));
}
}
}
// 标注素数表格
void labelPrimeTable(int nums, int cols, real dx, real dy, pen[] pens) {
int[] primes=getPrimeFactors(nums);
drawTable(nums,cols,dx,dy);
for (int i=2; i<=nums; ++i) {
bool[] b=sequence(new bool(int j) {return i % primes[j] ==0; }, primes.length);
int j=find(b);
if (j == -1) {
labelnumber(i,cols,dx,dy,linewidth(0));
} else {
labelnumber(i,cols,dx,dy,(i == primes[j] ? nullpen : pens[j]));
}
}
}
struct primetable {
int nums;
int cols;
int rows;
real dx;
real dy;
}貌似将 primetable 作为一种数据结构(struct)处理更好一点,后面试补一下吧






















问 一个趣味循环编程练习