标签:
这种题目一般都是画出前进方向,然后找规律即可,要注意特殊情况的考虑
#include<stdio.h>
#include<stdlib.h>
int main() {
int n,i,j,k,x,y,flag=0,sum=0;
//建立动态数组
scanf("%d",&n);
int **a;
a=(int**)malloc(sizeof(int*)*n);
if(a==NULL) {
printf("Out of memory!\n");
exit(-1);
}
for(i=0; i<=n-1; i++) {
a[i]=(int*)malloc(sizeof(int)*n);
if(a[i]==NULL) {
printf("Out of memory!\n");
exit(-1);
}
}
if(n==1)
printf("1\n1");
else {//根据→↑←←↓↓→→→↑↑↑←←←←↓↓↓↓→→→→ 找规律
i=0;
j=1;
x=(n-1)/2;
y=x;
a[x][y]=j;//初始化到中央位置
while(flag==0) {
i++;
for(k=1; k<=i; k++) {
j++;
y++;
a[x][y]=j;
if(x==n-1&&y==n-1) {
flag=1;
break;//最后一步在第一个循环里,做到两重跳出
}
}
if(flag==1)
break;
for(k=1; k<=i; k++) {
j++;
x--;
a[x][y]=j;
}
i++;
for(k=1; k<=i; k++) {
j++;
y--;
a[x][y]=j;
}
for(k=1; k<=i; k++) {
j++;
x++;
a[x][y]=j;
}
}
for(i=0; i<=n-1; i++) {
for(j=0; j<=n-1; j++) {
printf("%d ",a[i][j]);
if(i==j||i+j==n-1)
sum+=a[i][j];//对角线和
}
printf("\n");
}
printf("%d",sum);
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main() {
int n,circle=1,j,k,count=1,x=1,y=1,flag=0;
scanf("%d",&n);
if(n==1) {
printf("1/1");
} else {
for(;;) {
y++;
count++;
if(count==n)
break;
for(k=1;k<=2*circle-1;k++)
{
x++;y--;
count++;
if(count==n)
{
flag=1;
break;
}
}
if(flag==1)
break;
x++;
count++;
if(count==n)
break;
for(k=1;k<=2*circle;k++)
{
x--;y++;
count++;
if(count==n)
{
flag=1;
break;
}
}
if(flag==1)
break;
circle++;
}
printf("%d/%d",x,y);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/lhy1024/p/5205736.html