找回密码
 点一下
楼主: kimjongmin

来个会C++的吧~~~

[复制链接]
traxex 该用户已被删除
发表于 2008-6-4 09:58:37 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2008-6-4 12:14:33 | 显示全部楼层
朱朱的代码实在看不明白,所以我自己写了一个

//---------------------------------------------------
#include <iostream>
#include <iomanip>
using namespace std;

class Num
{
    int **data ;
public:
    void fill(int) ;
    void print(int) ;
    ~Num() { delete data ; }
};

void main()
{
    Num num ;
    int n ;
    cout << "input a number: " ;
    cin >> n ;
    num.fill(n) ;
    num.print(n) ;
}

void Num::fill(int n)
{
    int i ;
    data = new int* [n] ;
    for ( i = 0; i < n; i++ )
    {
        *( data + i ) = new int [n] ;
    }
    int xs = 0, xe = n - 1, ys = 0, ye = n - 1 ;
    int num = 1 ;
    do
    {
        for ( i = 0; i <= (xe-xs); i++ )
        {
            data[ys][xs + i] = num ;
            num ++ ;
        }
        ys ++ ; //y轴的起点+1

        for ( i = 0; i <= (ye-ys); i++ )
        {
            data[ys + i][xe] = num ;
            num ++ ;
        }
        xe -- ; //x轴终点-1

        for ( i = (xe-xs); i >= 0; i-- )
        {
            data[ye][xs + i] = num ;
            num ++ ;
        }
        ye -- ; //y轴终点-1

        for ( i = (ye-ys); i >= 0; i-- )
        {
            data[ys + i][xs] = num ;
            num ++ ;
        }
        xs ++ ; //x轴终点+1
    }while ( num <= n*n ) ;
}

void Num::print(int n)
{
    cout << "_____________________________" <<endl<<endl<<endl ;
    int i,j ;
   
    for ( i = 0; i < n; i++ )
    {
        for ( j = 0; j < n; j++)
        {
            cout << setw(6) << data[j] ;
        }
        cout << endl<<endl ;
    }
    cout << endl ;
}
回复

使用道具 举报

发表于 2008-6-4 12:40:23 | 显示全部楼层
我发誓我连题目都没看懂
回复

使用道具 举报

发表于 2008-6-4 12:41:58 | 显示全部楼层
渣吃真素越來越渣鳥
你的code和渣渣熊的code不都素一圈圈往數組填數字么...
回复

使用道具 举报

发表于 2008-6-4 13:22:59 | 显示全部楼层
偶也写了个,不过没测试。
  1. int f(a,i,j)
  2. {
  3.     int m;    //外圈
  4.     int A = a-1
  5.     int count=0;
  6.     if(a<=i)||(a<=j)||(i<0)||(j<0) return -1;
  7.     for(m = 0;m>min(min(i,A-i),min(j(A-j);m+=1)
  8.     {
  9.         count += (A-2*m)*4;
  10.     }
  11.     //内圈
  12.     if(i<=j)&&(A-i-j>0)         //上
  13.         return count+j-i;
  14.     if(i<=j)&&(A-i-j<0)         //左
  15.         return count+(2*i-A)+(j-i);
  16.     if(i>j)&&(A-i-j<0)          //下
  17.         return count+2*(2*j-A)+(j-i);
  18.     if(i<j)&&(A-i-j>0)          //右
  19.         return count+3*(A-2*j)+(j-i);
  20. }
复制代码
回复

使用道具 举报

发表于 2008-6-4 13:27:31 | 显示全部楼层
555,叔叔居然不看标题就进来了
回复

使用道具 举报

发表于 2008-6-4 14:09:25 | 显示全部楼层

某C版。

付程序一隻...
單次遍歷...

#include <stdio.h>
#include <stdlib.h>
void matrix(int n){
    int *buffer=(int *)malloc(n*n*4+4),*buf=&buffer[1],i,j,k=0;
    for(buffer[0]=0,j=0;j<n;++j){
        for(i=0;i<n;++i,++k){
            printf("%d%s",buf[k]=i+j<n?i>=j?buf[k-1]+1:j==i+1?buf[k-n]+n*4-5-i*8:buf[k-n]-1:i>=j?buf[k-n]+1:buf[k-1]-1,(i+1)%n?"\\t":"\\n");
        }
    }
    free(buffer);
}
int main(){
    matrix(10);
    return 0;
}
回复

使用道具 举报

发表于 2008-6-4 16:52:03 | 显示全部楼层
LS神人,条件3语句用到这份上了~~
回复

使用道具 举报

发表于 2008-6-4 18:45:43 | 显示全部楼层
鄙视,程序是写给人看的好不好.....

渣白你那段代码运行时出错了
回复

使用道具 举报

发表于 2008-6-4 18:48:50 | 显示全部楼层
程序素用来解决问题的!
好罢。这下对了。看来还素优先级问题。
回复

使用道具 举报

发表于 2008-6-4 19:02:56 | 显示全部楼层
完全看不懂计算过程的说

而且该代码运行的时候还是出错,点“忽略”倒是能显示正确的结果
回复

使用道具 举报

发表于 2008-6-4 19:13:51 | 显示全部楼层
明显偶完全咩问题。
你把出错消息发上来看看
回复

使用道具 举报

发表于 2008-6-4 19:23:25 | 显示全部楼层
无标题.jpg
111111111111
回复

使用道具 举报

发表于 2008-6-4 20:18:56 | 显示全部楼层
好罢。问题解决。
看来以后要少用C#这类傻瓜语言了。
回复

使用道具 举报

发表于 2008-6-4 20:25:22 | 显示全部楼层
..白银太搞笑了,这段代码结构不好看,效率也不高,就算用的if else也比条件语句高效,在某些讨论C语言编译过程的书中有提到
回复

使用道具 举报

发表于 2008-6-4 20:32:41 | 显示全部楼层
灭错。我只素用一段很搞笑的代码提供了另外一种思路而已。
回复

使用道具 举报

发表于 2008-6-4 20:35:40 | 显示全部楼层
嗨嗨,膜拜LS,其实语言就该是这样用的..
回复

使用道具 举报

traxex 该用户已被删除
发表于 2008-6-4 23:29:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2008-6-4 23:55:52 | 显示全部楼层
太渣了渣渣熊。
说到效率的话,这段代码的效率并不比常规的差
你自己可以算一下比较的次数
回复

使用道具 举报

发表于 2008-6-5 00:19:49 | 显示全部楼层
好罢。经测试,偶的算法的效率素你的3倍左右~
测试素在相同情况下不打印结果计算n=32各10000次。
然后计算总时间。
结果素你的代码总时间0.4262s而偶的素0.1455s(偶的pc的执行时间)

付测试用代码。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int buffer_t[2048];
int *buf_t;

class Num{

   int data[32][32];
   int i,j;
   int ii,jj;

public:
   void fill( int n);
};

void Num::fill(int n){
   i=0;
   j=0;
   ii=0;
   jj=1;
   for ( int x=0;x<32;x++){
      for ( int y=0;y<32;y++){
         data[x][y]=0;
      }
   }
   for( int m=0; m<n*n; m++){
      data[j]=m+1;

      if ( i+ii<0 || j+jj<0 || i+ii>n-1 || j+jj>n-1   || data[i+ii][j+jj]!=0 ){

         if ( ii==-1 && jj==0){
            ii=0;
            jj=1;
         }else if ( ii==0 && jj==1){
            ii=1;
            jj=0;
         }else if ( ii==1 && jj==0){
            ii=0;
            jj=-1;
         }else if ( ii==0 && jj==-1){
            ii=-1;
            jj=0;
         }

      }

      i+=ii;
      j+=jj;
   }
}

void matrix(int n){
    int i,j,k=0;
    for(buffer_t[0]=0,j=0;j<n;++j){
        for(i=0;i<n;++i,++k){
            buf_t[k]=i+j<n?i>=j?buf_t[k-1]+1:j==i+1?buf_t[k-n]+n*4-5-i*8:buf_t[k-n]-1:i>=j?buf_t[k-n]+1:buf_t[k-1]-1;
        }
    }
}

int main(){
    Num num;
    int i;
    buf_t=&buffer_t[1];

    LARGE_INTEGER start;
       LARGE_INTEGER end;
       LARGE_INTEGER frequent;
       __int64 diff;
       double msec;

       QueryPerformanceCounter(&start);

       for(i=0;i<10000;++i) num.fill(30);

       QueryPerformanceCounter(&end);
       diff=(__int64)end.QuadPart-(__int64)start.QuadPart;
       QueryPerformanceFrequency(&frequent);
       msec=(double)diff/(double)frequent.QuadPart;

       printf("%f\\n",msec);

    QueryPerformanceCounter(&start);

       for(i=0;i<10000;++i) matrix(30);

       QueryPerformanceCounter(&end);
       diff=(__int64)end.QuadPart-(__int64)start.QuadPart;
       QueryPerformanceFrequency(&frequent);
       msec=(double)diff/(double)frequent.QuadPart;

       printf("%f\\n",msec);

    return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-10-1 09:28 , Processed in 0.066851 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表