shshsh_0510 发表于 2008-9-5 13:23:12

和直接输出对比一下,不知哪位仁兄还能给优化一下,哪怕少几个字符也好
#include <iostream>
#include <math.h>
using namespace std;

inti,j,t,p,q,z,d;
void test2(){
#define r(x) (int)(x>0?x+.5:x-.5)
#define O(x,n,k) r(1.4*n*x(.78*k/n))
#define g(n,k,x) ((abs(x)<n?x:n*x/abs(x))+3)
for(i=1;i<64;i++){p=sqrt(i);t=p%2?(p+1)/2:p/2;z=i-4*t*t+3*t;d=i;}
for(i=0;i<64;i++)cout<<(i%8?"\t":"\n")<<64-d;
}


void test1(){
cout<<"1 2 3 4 5 6 7 8\n28 29 30 31 32 33 34 "
<<"9\n27 48 49 50 51 52 35 10\n26 47 60 61 62 53 36 11\n25 46 59 64 63 54 37 12\n24 45 58 57 56 55 38 13\n"
<<"23 44 43 42 41 40 39 14\n22 21 20 19 18 17 16 15";
}

void main(){
        test2();
        cout<<endl;
        test1();
}

shshsh_0510 发表于 2008-9-5 13:48:45

变量j p q 可以省去,如果有round函数,第一个宏可以省去,则比直接输出大概长了下面两句的长度
inti,j,t,p,q,z,d;
#define O(x,n,k) round(1.4*n*x(.78*k/n))

我是想不出其他法子了

shshsh_0510 发表于 2008-9-5 14:33:44

再少几个字符 :)#include <iostream>
#include <math.h>
int i,t,z,d;
void main(){
#define r(x) (int)(x>0?x+.5:x-.5)
#define g(x) ((abs(x)<t?x:t*x/abs(x))+3)
#define f(x) for(i=x;i<64;i++)
f(1){t=sqrt(i);t=t%2?(t+1)/2:t/2;z=i-4*t*t+3*t;d=i;}
f(0) std::cout<<(i%8?"\t":"\n")<<64-d;
}


[ 本帖最后由 shshsh_0510 于 2008-9-5 15:11 编辑 ]

shshsh_0510 发表于 2008-9-5 15:00:18

改出错了:P

kofeffect 发表于 2008-9-5 16:22:29

人工填充,有内到外,好长啊:L
#include<stdio.h>
#define MAX 8
void main()   
{
        int iSquare = MAX*MAX;
        int i = 0,j=0,k=0;
        int iArr = {0};
        bool bEnd = false;
        int hSub,lSub;
        bool hFlag,lFlag;
        if (MAX<2)
                return;
        if (MAX%2==0)//even
        {
                hSub = MAX/2;
                lSub = MAX/2-1;
                hFlag = false;
                lFlag = true;
        }
        else//odd
        {
                hSub = (MAX-1)/2;
                lSub = (MAX-1)/2;
                hFlag = true;
                lFlag = false;
        }
        iArr= iSquare--;
        for (i=0;;i++)
        {
                for (j=0; j<=i; j++)//列
                {
                        if (lFlag){
                                lSub++;
                        }
                        else{
                                lSub--;
                        }               
                        iArr= iSquare--;
                        if (iSquare == 0){
                                bEnd = true;
                                break;
                        }
                }
                lFlag = !lFlag;
                if (bEnd == true){
                        break;
                }       

                for (k=0; k<=i; k++)//行
                {
                        if (hFlag){
                                hSub++;
                        }
                        else{
                                hSub--;
                        }
                        iArr = iSquare--;
                }
                hFlag = !hFlag;
        }
        for (i=0;i<MAX;i++)
        {
                for (j=0;j<MAX;j++)
                {
                        printf("%3d   ",iArr);
                }
                printf("\n");
        }
}

shshsh_0510 发表于 2008-9-5 16:31:16

再少几个字符:)#include <iostream>
#include <math.h>
int i,t,d;
void main(){
#define r(x) ((int)(x>0?x+.5:x-.5))
#define g(x) ((abs(x)<t/2?x:t*x/2/abs(x))+3)
#define f(x) for(i=x;i<64;i++)
f(1){t=sqrt(i);t+=t%2;d=i;}
f(0) std::cout<<(i%8?"\t":"\n")<<64-d;
}

无心人 发表于 2008-9-5 16:37:46

:)


BT了

用#define就流于形式化了阿

mathe 发表于 2008-9-5 17:13:40

其实用c版本应该更加短,比如main函数前面void可以不写,全局变量申明int可以省略,除了math.h头文件可以不包含.不过这种优化觉得意思不大

shshsh_0510 发表于 2008-9-5 17:26:14

原帖由 mathe 于 2008-9-5 17:13 发表 http://bbs.emath.ac.cn/images/common/back.gif
全局变量申明int可以省略
这个怎么省略呀?

mathe 发表于 2008-9-5 17:47:38

比如c程序
i,j,main(){for(i=1,j=0;i<=100;j+=i,i++);printf("%d\n",j);}
是合法的c程序.(注意如果在Visual Studio上编译,将文件名后缀设为.c,同样在Linux下,要用gcc而不是g++编译)
页: 1 [2] 3 4 5
查看完整版本: 打印螺旋方阵