『アルゴリズムノート』2.5小節——C/C++快速入門->配列

47607 ワード

『アルゴリズムノート』2.5小節——C/C++快速入門->配列
問題A:練習問題6-4秩序挿入
[命題者:外部インポート]時間制限:1.000 secメモリ制限:12 MB解決:2226提出:3679問題は順序付けされた配列を記述し、数を入力した後、元の順序付けの規則に従って配列に挿入することを要求する.
配列の長さが10であると仮定すると、配列の最初の9つの数(この9つの数はキーボードから入力する必要があり、入力時に小さいものから大きいものまでの入力順序を満たす必要がある)は、小さいものから大きいものまでソートされます.
次にキーボードに整数を入力し、最後の10個の数が小さいものから大きいものになるように、前の9個の数に挿入します.
最初の行にスペースで区切られた9つの整数を入力し、小さい順に入力します.
2行目に整数を入力
出力は小さいから大きいまでこの10個の数を出力し、1行ずつ数えます.サンプル入力Copy 1 11 21 31 41 51 61 71 81 45サンプル出力Copy 1 11 21 31 41 45 51 71 81配列の定義を求めるとき、配列長を10とする.
プログラムコード1:
#include
int findElem(int a[],int x)
{
	int i;
	for(i=0;i<9;++i)
	{
		if(x<a[i])
		return i;
	}
	return i;
}
void insertElem(int a[],int x)
{
	int p,i;
	p = findElem(a,x);
	for(i=9;i>=p;--i)
	{
		a[i+1] = a[i];
	}
	a[p] = x;
}

int main()
{
	int a[10],num;
	for(int i=0;i<9;++i)
	{
		scanf("%d",&a[i]);
	}
	scanf("%d",&num);
	insertElem(a,num);
	for(int i=0;i<10;++i)
	{
		printf("%d
"
,a[i]); } return 0; }

プログラムコード2:
#include 
int main()
{
	int a[10];
	for(int i=0;i<10;i++)
		scanf("%d",&a[i]);
	int temp=a[9],pos=8;
	while(a[pos]>temp)
	{
		a[pos+1]=a[pos];
		--pos;
	}
	a[pos+1]=temp;
	for(int i=0;i<10;i++)
		printf("%d
"
,a[i]); return 0; }

質問B:練習問題6-5配列要素逆置き
[命題者:外部インポート]時間制限:1.000 secメモリ制限:12 MB解決:2027提出:2503問題記述長さ10の整数配列の値を逆順序で再保存します.
例えば、従来の順序は1,2,3,4,5,6,7,8,9,0であり、要求は0,9,8,7,6,5,4,3,2,1に変更される.
キーボードからスペースで区切られた10個の整数を入力します.
出力はこの10個の数を逆の順序で出力し,各数が1行を占める.サンプル入力Copy 1 2 3 4 5 6 7 8 9 0サンプル出力Copy 0 9 8 7 6 5 4 3 1
プログラムコード:
#include
int main()
{
	int a[10],temp;
	for(int i=0;i<10;++i)
	{
		scanf("%d",&a[i]);
	}
	for(int i=0;i<5;++i)
	{
		temp = a[i];
		a[i] = a[9-i];
		a[9-i] = temp;
		
	}
	for(int i=0;i<10;++i)
	{
		printf("%d
"
,a[i]); } return 0; }

問題C:練習問題6-6楊輝三角
[命題者:外部導入]時間制限:1.000 secメモリ制限:12 MB解決:1980提出:2873題記述要求通りに以下のフォーマットの楊輝三角を入力
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
最大出力10レベル
入力入力は正の整数nのみを含み、出力する楊輝三角の層数を表す.出力はこの入力に対応します.該当する層数の楊輝三角を出力してください.各層の整数の間にサンプル入力Copy 5サンプル出力Copy 1 1 1 1 1 1 1 2 1 3 1 4 4 1を1つのスペースで区切ってください.
プログラムコード:
これはちょっと難しいので、ダイナミックな計画でやります.
#include
 
int main()
{
	int i,j,n;
	scanf("%d",&n);
	int a[n][n];
	
	for(i=0;i<n;i++){
		a[i][i]=1;
		a[i][0]=1;
	}
	
	for(i=2;i<n;i++){
		for(j=1;j<=i-1;j++){	
			a[i][j]=a[i-1][j-1]+a[i-1][j];
	   }
	}
	
	for(i=0;i<n;i++){
		for(j=0;j<=i;j++){
			printf("%d ",a[i][j]);
	   }
	   printf("
"
); } return 0; }

問題D:練習問題6-12解読
[命題者:外部導入]時間制限:1.000 secメモリ制限:12 MB解決:1833提出:2799題記述に1行の電文があり、すでに以下の規則によって暗号化されている.
A–>Z a–>z
B–>Y b–>y
C–>X c–>x
… …
すなわち、最初のアルファベットは26番目のアルファベットになり、i番目のアルファベットは(26-i+1)番目のアルファベットになり、非アルファベット文字は変わらない.パスワードに基づいて原文に翻訳し、出力することを要求します.
1行の暗号文を入力して復号後の原文を出力し、単独で1行を占める.サンプル入力Copy ZYX 123 zyxサンプル出力Copy ABC 123 abc
プログラムコード:
#include
#include
int main()
{
	char s[100];
	scanf("%s",s);
	for(int i=0;i<strlen(s);i++)
	{
		if(s[i]>=65&&s[i]<=90)
			s[i] = 155 - s[i];
		else if(s[i]>=97&&s[i]<=122)
			s[i] = 219 - s[i];
	}
	printf("%s",s);
	return 0;
}

質問E:練習問題6-13文字列比較
[命題者:外部インポート]時間制限:1.000 secメモリ制限:12 MB解決:1753コミット:2497タイトル記述2文字列s 1とs 2のサイズを比較し、s 1>s 2の場合、正数を出力します.s 1=s 2の場合、0が出力される.もしs 1
要件:strcpy関数を使用しない;2つの文字列をgets関数で読み込みます.
例えば、「A」は「C」に比べて「A」である
同様に、「And」と「Aid」を比較すると、2文字目の比較の結果、「n」は「i」より5大きいので、「5」を出力すべきである
入力2行文字列
2つの文字列の比較の差を示す整数を出力し、1行ずつ占めます.サンプル入力Copy And Aidサンプル出力Copy 5
プログラムコード:
#include 
#include 
int main()
{
	char s1[100], s2[100];
	int result;
	gets(s1);
	gets(s2);
	int len_min = strlen(s1)>strlen(s2)? strlen(s2):strlen(s1);
	for(int i=0;i<=len_min;i++)
	{
		if(s1[i]==s2[i])
			continue;
		if(s1[i]!=s2[i])
		{
			result = s1[i] - s2[i];
			printf("%d",result);
			break;
		}	
	}
	if(result==0)
		printf("0");
	return 0;
}

問題F:例題6-1逆順出力配列要素
[命題者:外部インポート]時間制限:1.000 secメモリ制限:12 MB解決:1495コミット:1880タイトル記述キーボードから10個の整数を入力し、長さ10の整数配列に格納し、入力した10個の数を逆シーケンスで出力する必要がある.
入力:0,1,2,3,4,5,6,7,8,9出力9,8,7,6,5,4,3,2,1,0
10個の整数を入力し、入力した10個の整数を1行ずつスペースで区切って逆順に出力します.サンプル入力Copy 0 1 2 3 4 5 6 7 8 9サンプル出力Copy 9 8 7 6 5 4 3 1 0
プログラムコード:
#include
int main()
{
	int a[10];
	for(int i=0;i<10;++i)
		scanf("%d",&a[i]);
	for(int i=9;i>=0;--i)
		printf("%d
"
,a[i]); return 0; }

問題G:例題6-2配列解Fibonacci数列問題
[命題者:外部導入]時間制限:1.000 secメモリ制限:12 MB解決:1619提出:1832題記述Fibonacci数列の特徴:1,2番目の数は1,1である.3番目の数から、概要は前の2つの数の和です.次のようになります.
Fibonacci数列の上位20個を出力することを要求します.
出力のないFibonacci数列の上位20個の数を入力し、各数が1行を占めます.サンプル入力Copyサンプル出力Copy 1 1 1 2 3 5 8 13 34 55 89 144 233 377 610987 1597 2584 4181 6765
プログラムコード:
#include
int main()
{
	int a[20];
	a[0] = 1;
	a[1] = 1;
	for(int i=2;i<20;++i)
	{
		a[i] = a[i-1] + a[i-2];
	}
	for(int i=0;i<20;++i)
		printf("%d
"
,a[i]); return 0; }

問題H:例題6-3発泡ソート
[命題者:外部インポート]時間制限:1.000 secメモリ制限:12 MB解決:1731提出:2802タイトル記述キーボードから10個の整数を入力し、この10個の数をバブル法で並べ替えます(小さいから大きいまで).スペースで区切られた10個の整数を入力して順番に並べられた10個の整数を出力し、各数が1行を占めます.サンプル入力Copy 1 3 5 7 9 9 9 9 9 2 4 8 0サンプル出力Copy 0 1 2 3 4 6 8 9
プログラムコード:
#include
int main()
{
	int a[10];
	int temp;
	for(int i=0;i<10;++i)
		scanf("%d",&a[i]);
	for(int i=0;i<9;i++)
	{
		for(int j=0;j<9-i;++j)
			{
				if(a[j]>a[j+1])
				{
					temp = a[j];
					a[j] = a[j+1];
					a[j+1] = temp;
				}
			}
	}
	for(int i=0;i<10;++i)
		printf("%d
"
,a[i]); return 0; }

問題I:例題6-4マトリクス転置
[命題者:外部インポート]時間制限:1.000 secメモリ制限:12 MB解決:1634提出:2017問題記述1つの2行3列の行列(2次元配列)行列を交換し、別の3行2列の行列に格納する.
整数データを例にして解く必要がある.
2行のデータを入力し、行ごとに3つの整数をスペースで区切ります.行列交換後の行列を出力し、3行、各行2データをスペースで区切ります.サンプル入力Copy 1 2 3 4 5 6サンプル出力Copy 1 4 2 5 6
プログラムコード:
#include
int main()
{
	int a[2][3];
	for(int i=0;i<2;++i)
		for(int j=0;j<3;++j)
			scanf("%d",&a[i][j]);
	for(int i=0;i<3;++i)
		for(int j=0;j<2;++j)
		{
			printf("%d ",a[j][i]);
			if(j==1)
				printf("
"
); } return 0; }

問題J:例題6-9文字列最大値を求める
[命題者:外部インポート]時間制限:1.000 secメモリ制限:12 MB解決:1663コミット:2448タイトル記述キーボードから3文字列を入力し、その最大を求める.3行を入力します.各行は1文字列です.
1行を出力し、3つの文字列の最大値を入力します.サンプル入力Copy England China Americaサンプル出力Copy England
プログラムコード:
#include
#include
int main()
{
	char s1[100],s2[100],s3[100];
	gets(s1);
	gets(s2);
	gets(s3);
	char *max = s1;
	if (strcmp(max, s2) < 0) max = s2;
    if (strcmp(max, s3) < 0) max = s3;
    printf("%s",max);
    return 0;
}