アルゴリズムブラッシングの基礎(1)-アルゴリズムの基礎知識

1.アルゴリズムブラッシングWebサイトの入力要件に対応します

1.入力がいつ終了するかわからない場合はどうすればよいですか?

例えば:

PAT 1002:正の整数nを読み取り、その桁の合計を計算し、合計の各桁を中国語の拼音で書き出します。

入力した正の整数の長さがわかりません。どうすればよいですか。

法一:while……EOF型

while(scanf("%d",&n)!=EOF){
	……
}

コードの意味は次のとおりです。ファイルを読み取るとき、ファイルの終わりが読み取られるまでループを続けます。nを繰り返し読み込み、ループ本体の内容を実行します。

scanfはユニバーサルであり、文字列(%s)または数値(%d)のいずれかです。文字列だけの場合は、gets()およびgetchar()を使用することもできます。

while(gets(str)!=NULL){
	……
}
char ch=getcahr();
while(ch!='\n'){
        ……
        ch=getchar();
    }

これは、文字列をバッファ領域に入力し(Enterキーを押して入力の終了を示す)、ch = getchar()を1回書き込むと、chがバッファ領域から文字を取得することを意味します。終了マーク\nが検出されました。

2.入力がいつ終了するかを知るための最も単純な構造:

たとえば、ループをT回実行する必要がある場合は、次のように記述できます。

while(T--){
	……
}

2.はじめに-はじめにシミュレーション

単純なシミュレーション、要素の検索、およびグラフィック出力は、説明するには単純すぎます。

日付処理、基数変換、および文字列処理について説明しましょう。

日付処理:2つの日付が与えられた場合、それらの間の日数の違いを見つける方法は?

アイデアの分析:一般的な数学的思考に従う場合は、うるう年、平年では31日と28日などを考慮します。コンピューター思考に従う場合は、カウンターを置き、キャリーを設定し、前の日付にします1ずつ増やし続け、次の日付と等しくなると停止し、記録します。回数プラス1は、それらの間の日数です。

基数変換:P基数をQ基数に変換する方法。(P、Q <= 10)

*アイデアの分析:* 2つのステップに分かれています。最初のステップはPベースの数値を10進数に変換し、2番目のステップは10進数をQベースの数値に変換することです。

1.Pベースの数値を10進数に変換します

10進数y=d1d2d3d4 ... dnの場合、次の形式で記述できます。
wumiaosu

Pベース番号y=d1d2d3d4 ... dnの場合、次の形式で記述できます。
ここに画像の説明を挿入

そして、この式はループで簡単に実装できます。

int y=0,product=1;
while(x!=0){
	y=y+(x%10)*product;
	x/=10;
	product=product*P;
}

2.10進数をQ数に変換します

ベースの剰余コードを除算します。10進数のyをQベースに変換します

int z[40],num=0;
do{
	z[num++] = y % Q;
	y = y / Q;
} while(y!=0)

文字列処理:文字列を読み込んで、回文かどうかを判断します。

アイデアの分析:下付き文字0からlen / 2までトラバースします(たとえば、10個の数字、4に到達するのが適切です。次に、下付き文字を01234までトラバースします(9個の数字など)。3個までトラバースします。トラバーサル下付き文字は0123です。 、真ん中の5は考慮されず、後者の6789は前に対応します)。

次に、str[i]とstr[len-1-i]が等しいかどうかを判断します。

重要なアイデアを並べ替える:

トピック:小学校は最近スポンサーシップを受けており、その一部を使用して、成績の良い上位5人の生徒に奨学金を提供する予定です。学期末には、各学生に中国語、数学、英語の3つの科目があります。※2人の生徒の合計点数が同じ場合は言語の降順で並べ替えられます。合計点数と言語が同じ場合は生徒数の少ない方が優先されます。※上記の要件に従い、その機能を実現するためのプログラムを実施してください。

アイデアの分析:アルゴリズムヘッダーファイルのsort関数をうまく利用し、cmp関数を記述し、関数で条件ステートメントを使用して質問の意味を満たします。

#include<iostream>
#include<algorithm>
using namespace std;

struct score {
	int chinese;
	int math;
	int english;
	int num;
};
bool cmp(score x, score y) {//这招niubi
	if (x.chinese + x.math + x.english != y.chinese + y.math + y.english)
		return x.chinese + x.math + x.english > y.chinese + y.math + y.english;
	else {
		if (x.chinese != y.chinese) {
			return  x.chinese > y.chinese;
		}
		else
			return x.num < y.num;
	}
}

int main() {
	score a[1000];
	int N;
	cin >> N;//输入学生个数
	for (int i = 0; i < N; i++) {
		cin >> a[i].chinese >> a[i].math >> a[i].english;//按照语数英的顺序输入成绩
		a[i].num = i;
	}
	sort(a, a + N, cmp);
	for (int i = 0; i < N; i++) {
		cout << a[i].chinese << " " << a[i].math << " " << a[i].english << " " << a[i].num <<" " << a[i].chinese + a[i].math + a[i].english<<endl;
	}
	return 0;
}

ジョセフリング:

質問:[問題の説明] 1、2、3、...、n(n <1000)として記録されたn枚のカードがあります。最初のカードが1になるように配置し、次に2枚のカードを配置する必要があります。最後に順番に;一番上のカード(正確に2)を開き、次に3枚のカードを順番に置き、一番上のカード(正確に3)を開きます。以下同様に、最後のカードがnになるまで続けます。
[入力例]
8
[出力例]
17 5 2 6 8 4 3
思考分析:出力例を観察し、1の後に2つの未割り当ての数値を入れて2を入れ、次に3を入れた後に3つの未割り当ての数値を空にしてからジョセフを入力しますリング(下付き文字の残りの部分を使用してサイクルを実現できます)、次に割り当てられていない4つの番号を空にして、4...などを入力します。

#include<iostream>
using namespace std;

int main() {
	int n; cin >> n; //n<1000
	int arr[1001] = { 0 };
	int pos = 0, count = 3;//pos指向放数的位置,count表示pos进入到下一个pos的步长,比如1在下标1的位置,2在下标4的位置
	for (int i = 0; i <n; i++) {
		arr[pos%n] = i+1;  //约瑟夫环的思想
		if (i == n-1) break;
		int j = 0;
		while (j!=count) {  //该循环意思为经过count个不为零的数。
			pos++;
			if (arr[pos%n] == 0) {
				j++;
			}
		}
		count++;
		
	}

	for (int i = 0; i <n; i++) {
		cout << arr[i] << "  ";
	}
	return 0;
}

更新を続けています...

おすすめ

転載: blog.csdn.net/Dai_sir_man/article/details/120182597