「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 */ } }}