1、邮票组合
某人有四张3分的邮票和三张5分的邮票,用这些邮票中的一张或若干张可以得到多少种不同的邮资?
算法思路:
将问题进行数学分析,不同张数和面值的邮票组成的邮资可用下列公式计算:
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月的各月天数累加,再加上指定的日。但对于闰年,二月的天数29天,因此还要判定给定的年是否为闰年,为实现这一算法,需设置一张月天数列表,给出每个月的天数,考虑到闰年和平年的情况下,此表可设置成一个2行13列的二维数组,其中第一行对应的每行(设1~12列有效)元素是平年各月的天数,第二行对应的是闰年每月的天数。
#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;
}