[C++]白駿1171927481105012591032


11719番で出力2


入出力によるプログラムの作成
英字小文字、大文字、スペース、数字のみで構成される最大100行を入力します.各行は100文字を超えず、空の行があり、各行の前後にスペースがある可能性があります.
これはEOFへの入出力が必要な問題です.ウィンドウのEOFでコンソールウィンドウにctrl+zを入力します.この問題の入力は最大100行であるため,i<100条件が加わる.
#include<iostream>
#include<string>
using namespace std;

int main(void) {

	string str;
	string res;

	for (int i = 0; i<100 && !cin.eof(); i++)
	{
		getline(cin, str);
		
		if (i > 0)
			res += "\n";
		res += str;
	}
	cout << res;
}

cin.eof()


入力値が範囲内でない場合は、ファイルが終了する前に入力を受け入れることを意味します.eof()を利用すればいいです.
EOFがブール形式で読み込まれた場合、真の値が表示されます.
while (!cin.eof()) {    //EOF를 만날때까지 무한 입력
        cin >> n;
    }

2748番フィボナッチ数2


フィボナッチ数は0と1で始まる.0番目のフィボナッチ数は0で、1番目のフィボナッチ数は1です.2番目から前の2つのフィボナッチ数の和です.このようにしてFn=Fn−1+Fn−2(n≧2)となる.
n=17までは、次のようにフィボナッチ数を用いる.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597
nが与えられると,n次フィボナッチ数を求めるプログラムを記述する.
nは90以下の自然数である.
intの表示範囲を超えています.90番目のフィボナッチ数をチェックしていないため、2回エラーが発生します.

データ型


int : –2,147,483,648 ~ 2,147,483,647
unsigned int : 0 ~ 4,294,967,295
long long : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
intは4バイト、long longは8バイトを表す.
通常long資料型はint演算で超えた範囲を処理するために用いられる.
ちなみにdoubleも8バイトですが、小数点以下でより多く表示できるので、小数点を要求する演算にはdouble資料型が適しています.
90番目のフィボナッチ数は0番目から90番目の数字です.fibo[90]であるため,配列には91個の要素が必要である.この問題は一年生の時、循環関数で作った例題を見たことがある.しかし、90個のフィボナッチ数を事前に保存したほうが簡単だと思い、配列を作成して保存しました.
#include<iostream>
using namespace std;

int main(void) {

	long long fibo[91] = {0,1};
	
	for (int i = 2; i < 91; i++) {
		fibo[i] = fibo[i - 1] + fibo[i - 2];
	}
	int n;
	cin >> n;
	cout << fibo[n];
}

11050次二項係数1


自然数nと整数kが与えられると,この係数n Ckを解くプログラムが作成される.
n,kは最大10に制限される.
プライベートトークですが、フィボナッチ問題からこの係数問題に対する思い出が浮かびました.1年生の時にC言語の関数部分を勉強するとき、本を例によく出てくるので、それでもこの係数は?植え付けが思い出せない.しばらく大学入試をしても何の役にも立たない.(私の髪認証、坊主頭)
#include<iostream>
using namespace std;

int factorial(int);

int main(void) {

	int n, k;
	cin >> n >> k;

	cout << (double)factorial(n) / (factorial(n - k) * factorial(k));
}

int factorial(int num) {

	int result=1;
	for (int i = num; i >= 1; i--) {
		result *= i;
	}
	return result;
}

1259番パリンドロン手


後から読み取った数字が同じであれば、この数字はパリンドロム数です.121、12421などはパリン・ドロンソです.1231231は後ろから読むと違うので、パリンドロム数ではありません.入力がマルチライン入力の最後は0です.ファリンドロン数であればyesまたはnoを出力します.
これらの複数行の入出力結果の問題から,バックグラウンド例と同様であるべきであると考え,入力値と出力値を配列またはベクトルに格納した.しかし、他人のコードが気になるので、入力を受け取ると結果が出力されます.同じようにコードだけ延長されているような気がしますが、それよりも重要なのは、ファリンドロム数を求める方法の違いです.
方法の違いは次のとおりです.
1.char[6]の入力(0,6を含む)を受け入れ、パリンドロン文字を認識するように位置を交換して結果を比較する.
2.文字列を使用して入力を受信し、逆の結果と比較する
3.反転した数値の値と入力した値が同じかどうかを比較します.個人的にはこの方式は数字の特性をうまく利用していて、きれいに見えると思います.
/*3번 방식 코드
  n/=10 을 하고 %10을 하면 끝자리 하나만 나온다.
  그 전에 구해진 수를 *10 해서 자릿수를 하나씩 올리고 끝자리 하나를 합친다. 
  이를 반복하면 입력된 숫자 n의 역방향의 숫자를 구할 수있다. */
  
while(1) {
		scanf("%d", &n);
		if(n == 0) {
			break;
		}
		m = n;
		l = 0;
		while(n > 0) {
			l = l * 10 + n % 10;
			n /= 10;
		}
		printf(l == m ? "yes\n" : "no\n");
	}
なぜ代入演算子が思い出せないのか...
入力値に位置制限がなくても、パリントロム数を判別し、同じ数字の位置をすべて比較する方法を考えました.
12321のように5桁なら?
自分の位置vsは自分の位置に属し、布の位置vsは自分の位置に属する.
식으로 표현하면 다음과 같다.(n=10000)
				num/n 	vs	   	num%10
        num/(n/10)%10	vs	(num/10)%10
---------------------------------------------------------------
#include<iostream>
#include<vector>
using namespace std;

int main(void) {

	int n;
	vector<int> input;
    vector<string> result;
    
	do {
		cin >> n;
		if(n!=0)
			input.push_back(n);
	} while (n != 0);


	for (int number : input) {

		int n = 1;		//이 숫자의 자릿수 값 저장 변수

		for (; ;) {			
			if (number / n <= 9)		//나눈 몫의 범위가 1~9 사이이면 자릿수까지 곱해진 것이다
				break;
			else
				n *= 10;
		}

		bool flag;

		for (int i = 1; ; i*=10) {
		
			if (n / i == 0) {	// 몫이 0이면 자릿수를 벗어난 것이므로 break
				break;
			}
				
			if ((number / (n / i)) % 10 == (number / i) % 10)
				flag = true;
			else {
				flag = false;	//하나라도 틀린게 있으면 break 팰린드롬이 아니다
				break;
			}
		}

		if (flag == true)
			result.push_back("yes");
		else
			result.push_back("no");
	}
    
	for (string str : result){
		cout << str <<endl;
    }
}
ご覧のように、コードは少し粗悪です.数字の特性を利用して3番方式のように和を求めれば、もっと簡単です.誰かがそう思っていることを考えればいい.テストの結果、int型なので9桁に制限されており、long longであればもっと大きな桁でテストできます.

1032号コマンドプロンプト


この問題は,まず検索結果を与え,次に検索する結果をモードで印刷することである.パターンにはアルファベットと「.」が含まれています.そして「?」置くしかない.よろしければ.乙を使わないでください.このディレクトリには検索結果のファイルしかないと仮定し、ファイル名の長さは同じです.
?ワイドキーのように、位置が一致すればどんなアルファベットでも来られます.
#include<iostream>
#include <vector>
using namespace  std;

int main() {

	int n;
	cin >> n;

	vector<string> fname(n);
	
	for (int i = 0; i < n; i++) {
		cin >> fname[i];
	}

	if (n == 1) {
		cout << fname[0];
		return 0;
	}

	int fnameLen = fname[0].length();
	char result[51] = {'\0'};		//최대 50개인거 유의 뒤에  널문자 넣어야해서 [51]

	//앞에서부터 비교하다 모두 같으면 넣고 하나라도 다르면 물음표 표시
	//입력값이 하나이면 그대로

	for (int i = 0; i < fnameLen; i++) {

		char before;
		char now= fname[0][i];

		for (int j = 1; j < n; j++) {
			
			before = now;
			now = fname[j][i];

			if (now != before) {
				result[i] = '?';
				break;
			}
			else
				result[i] = now;
		}
	}
	cout << result;
}