「C-test-2009-01-15」の編集履歴(バックアップ)一覧に戻る

C-test-2009-01-15 - (2009/01/17 (土) 22:37:43) のソース

*1月15日のラピッドプログラミング
**問題1
#codehighlight(c){{
#include<stdio.h> 
#include<stdlib.h> 

#define MAX_LENGTH 256 

/* The Calculation Function */ 
void calculateNextLine(int *line, int length) { 
	int tmp_line[MAX_LENGTH];
	int i;
	
	for(i=0; i<length; ++i)
	{
		tmp_line[i] = line[i];
	}
	
	line[0] = line[++length] = 1;
	//length here is a little tricky
	//length is the length of "last" line, not "current" line
	for(i=1; i<length; ++i)
	{
		line[i] = tmp_line[i-1] + tmp_line[i];
	}
}

/* Print Function */ 
void printLine(int *line, int length) { 
	int i; 
	for(i=0; i < length; i++) { 
		printf("%d ", line[i]);
	}
	printf("\n");
} 

/* Main Function */ 
int main(int argc, char *argv[])
{
	int n;
	int line[MAX_LENGTH] = {1}; 
	int length = 1;
	
	if(argc < 2)
	return 0;
	
	n = atoi(argv[1]);
	printLine( line, length ); 
	for( ;length <= n; )
	{ 
		calculateNextLine( line, length++ ); 
		printLine( line, length ); 
	}
}
}}
C++で記述すると次のようになる。
#codehighlight(c++){{
#include <iostream>
#include <iomanip>
#include <deque>
#include <cstdlib>

int digit(int n, int base)
{
   int x=1;
   while( n /= base)
      ++x;
   return x;
}
inline int digit(int n)
{
   return digit(n, 10);
}

class CPyramid
{
private:
   std::deque<std::deque<int> > pyramid;
public:
   CPyramid(int length);
   void push(int index);
   friend std::ostream &operator<<(std::ostream &stream, CPyramid &obj);
};

CPyramid::CPyramid(int length)
{
   std::deque<int> tmp;
   tmp.push_back(1);
   pyramid.push_back(tmp);
   for(int i=1; i<length; ++i)
      push(i);
}
void CPyramid::push(int index)
{
   // index:nのとき、個数はn+1個
   std::deque<int> tmp;
   tmp.push_back(1);
   for(int i=1; i<index; ++i)
   {
      tmp.push_back(pyramid.back().at(i-1) + pyramid.back().at(i));
   }
   tmp.push_back(1);
   pyramid.push_back(tmp);
}

std::ostream &operator<<(std::ostream &stream, CPyramid &obj)
{
   const int size = 1 + digit(obj.pyramid.back().at(obj.pyramid.back().size()/2));
   const int length = obj.pyramid.size();
   int counter=0;

   for(std::deque<std::deque<int> >::iterator i = obj.pyramid.begin();
      i != obj.pyramid.end(); ++i, ++counter)
   {
      stream << std::setw((length-counter)*size/2) << ' ';

      for(std::deque<int>::iterator j = i->begin();
         j != i->end(); ++j)
      {
         stream << std::setw(size) << *j;
      }
      stream << std::endl;
   }
   return stream;
}

int main(int argc, char* argv[])
{
   const int len = (argc < 2) ? 10 : atoi(argv[1]);
   if(argc < 2)
      std::cerr << "argument error." << std::endl;
   CPyramid pyrmd(len);
   std::cout << pyrmd;
   return 0;
}
}}
**問題2
**問題3
#codehighlight(c){{
#include <stdio.h>

void init_array(int array[], int index, int num);
void init_array_left(int array[], int index, int num);
void init_array_right(int array[], int index, int num);

int main(void)
{
   int array[15];
   int i;
   init_array( array, 7, 0 );
   for(i=0; i<15; ++i)
   {
      printf( "%d ", array[i] );
   }
   printf( "\n" );
   return 0;
}

void init_array(int array[], int index, int num)
{
   array[index] = num;
   init_array_left(array, index-1, num+1 ); /* Move left */
   init_array_right(array, index+1, num+1 ); /* Move right */
}

/* Function to move left */
void init_array_left(int array[], int index, int num)
{
   /* Fill here */
}
/* Function to move right */
void init_array_right(int array[], int index, int num)
{
   /* Fill here */
}
}}
目安箱バナー