原题目链接:http://blog.youkuaiyun.com/masterluo/article/details/4963960
从1~N这N个数按照下面的排法一直排下去,规定S(N)为左上角是1,右下角为N的这个大矩形里面的所有小矩形里的数的和。例如S(12)就表示图中12个绿色格子的数的和。现在给定N,让你求S(N)。
#include "stdio.h"
#define MX 10
long sum[MX+1];
int dim[MX+1];
void cal(){
int i, j;
for(i=0; i<=MX; i++)
dim[i] = i*i;
sum[0] = 0;
for(i=1; i<=MX; i++){
sum[i] = sum[i-1];
for(j=dim[i-1]+1; j<=dim[i]; j++)
sum[i] += j;
}
}
void main(){
int u;
int lev, i, j, count;
int start, end;
int mark;
int sums;
cal();
while(printf("输入:"), scanf("%d", &u), u){
for(lev=1; lev<=MX; lev++){
if(u<=dim[lev])
break;
}
if(lev>MX){
printf("数值太大!\n----------------\n");
continue;
}
mark = 1;
sums = sum[lev];
if(dim[lev]-lev<u){
count=u-dim[lev-1]-1;
for(i=lev-(dim[lev]-u+1); i>0; i--){
if(mark){
start = dim[lev-1]+1;
for(j=0; j<count; j++)
sums -= start+j;
mark = 0;
}else{
end = dim[lev];
for(j=0; j<count; j++)
sums -= end-j;
mark = 1;
}
count -= 2;
lev--;
}
}else{
count = dim[lev]-u;
for(i=lev-(u-dim[lev-1]); i>0; i--){
if(mark){
end = dim[lev];
for(j=0; j<count; j++)
sums -= end-j;
mark = 0;
}else{
start = dim[lev-1]+1;
for(j=0; j<count; j++)
sums -= start+j;
mark = 1;
}
count -= 2;
lev--;
}
}
printf("结果:%d\n----------------\n", sums);
}
}
好像是对的……