1.スタンプの組み合わせ
人は 3 セント切手を 4 枚と 5 セント切手を 3 枚持っています。これらの切手を 1 枚または複数枚使用すると、何通りの異なる郵便料金が得られますか?
アルゴリズムのアイデア:
この問題を数学的に分析するには、さまざまな番号と額面の切手の郵便料金を次の式で計算できます。
S = 3 * i + 4 *j
ここで、i は 3 セント切手の数、j は 5 セント切手の数です。
お題の要件に応じて、3点スタンプは0、1、2、3、4スタンプ、5点スタンプは0、1、2、3スタンプが撮れます。網羅方式を採用することにより、これらの金種・枚数の異なる切手を組み合わせた後の郵便料金を計算することができます。
int a[27];
int main(){
int i,j,k,s,n=0;
for(i=0;i<=4;i++){
for(j=0;j<=3;j++){
s=i*3 + j*5;
for(k=0;a[k];k++){
if(s == a[k])break;
}
if(!a[k] && s){a[k]=s;n++;}
}
}
printf("%d kinds:",n);
for(k=0;a[k];k++)
printf("%2d",a[k]);
}
2. 日付変換(配列)
特定の年、月、日を与えて、それをその年の日に変換して出力します。
アルゴリズムのアイデア:
アルゴリズムは非常に単純で、指定された月を i とすると、各月の日数を 1、2、3、...、i-1 と合計し、指定された日を加算します。ただし、閏年の場合は 2 月の日数が 29 日なので、その年が閏年であるかどうかを判定する必要がありますが、このアルゴリズムを実現するには、月の日数のリストを設定し、うるう年と平和年を考慮して、各月の日数を指定します。 この場合、このテーブルは 2 行 13 列の 2 次元配列として設定できます。各行の要素は最初の行に対応します。行 (列 1 ~ 12 が有効) は通常の年の各月の日数であり、2 行目は閏年の月の日数に対応します。
#include<stdio.h>
int day_of_year(day_tab,year,month,day){
int day_tab[][13];
int year,month,day;
int i,j;
//判定这闰年还是平年,i=0为平年,i=1为闰年
i = (year%4 == 0 && year%100 != 0) || year%400 == 0;
for(j=1;j<=month;j++){
day += day_tab[i][j];
}
return day;
}
int main(){
static int day_tab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
int y,m,d;
scanf("%d%d%d",&y,&m,&d);
printf("%d\n",day_of_year(day_tab,y,m,d));
return 0;
}