项目五
代码:
/*阿姆斯特朗数*/
#include <stdio.h>
int main()
{
int sum,i,m,s;
for(i=1;i<1000;i++)
{
m=i;
sum=0;
while(m>0)
{
s=(m%10)*(m%10)*(m%10);
sum+=s;
m=m/10;
}
if(sum==i)
printf("%d\n",i);
}
return 0;
}
项目六
代码:
/*1万年内的回文日*/
#include <stdio.h>
int main()
{
int year,q,w,e,r,t,month,day,h=0;
for(year=1001;year<10000;year++)
{
q=year%10;//求年份的个位数,年份个位数是月份十位数,所以小于等于1
w=(year%100)/10;
e=(year%1000)/100;//求年份的百分数,因为是回文数,所以年份百位数小于=3
r=year/1000;//年份的千位数
if(e<=3&&q<=1)
{
for(month=1;month<=12;month++)//月份的循环
{
switch(month)//判断月份,根据月份计算每月的天数
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:t=31;break;
case 4:
case 6:
case 9:
case 11:t=30;break;
default:
if((((year%4)==0)&&((year%100)!=0))||((year%400)==0))//判断该年是否是闰年,求出2月的天数
t=29;
else
t=28;
}
for(day=1;day<=t;day++)//每月天数的循环
{
if((e*10+r)==day&&(q*10+w)==month)
{
printf("%d年的%02d月%02d号是回文日\n",year,month,day);
h++;
}
}
}
}
}
printf("总计有%d个回文日",h);
return 0;
}
稍微修改了下
代码如下:
/*1万年内的回文日*/
#include <stdio.h>
int main()
{
int year,q,w,e,r,t,month=1,day=1,h=0;
for(year=1001;year<10000;year++)
{
q=year%10;//求年份的个位数,年份个位数是月份十位数,所以小于等于1
w=(year%100)/10;//年份的十位数,年份的十位数应该小于等于2
e=(year%1000)/100;//求年份的百分数,因为是回文数,所以年份百位数小于=3
r=year/1000;//年份的千位数
if(q<=1&&e<=3&&(q*10+w)!=0&&(q*10+w)<=12)
{
month=(q*10+w);
switch(month)//判断月份,根据月份计算每月的天数
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:t=31;break;
case 4:
case 6:
case 9:
case 11:t=30;break;
default:
if((((year%4)==0)&&((year%100)!=0))||((year%400)==0))//判断该年是否是闰年,求出2月的天数
t=29;
else
t=28;
}
day=(e*10+r);
if(day<=t)//每月天数的循环
{
printf("%d年的%02d月%02d号是回文日\n",year,month,day);
h++;
}
}
}
printf("总计有%d个回文日",h);
return 0;
}
解法3:通过月份日期查年,直接求出回文日
代码:
/*1万年内的回文日*/
#include <stdio.h>
int main()
{
int month,year,day,t,i=0;
for(month=1;month<=12;month++)//月份循环
{
t=2;//暂时给t赋值,以免t被随机赋值
for(day=1;day<=t;day++)//月天数循环,t为判断大小月和闰月,并根据t的值决定循环次数
{
if(day%10!=0)//排除每月以0结尾的日期
{
year=((day%10)*1000+(day/10)*100+(month%10)*10+month/10);//求出某月某日所对应的回文年
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:t=31;break;
case 4:
case 6:
case 9:
case 11:t=30;break;
default:
if((((year%4)==0)&&((year%100)!=0))||((year%400)==0))//判断该年是否是闰年,求出2月的天数
t=29;
else
t=28;
}
if(year>=1000)//1000年前没有对应的回文日,略去
{
printf("%d年的%02d月%02d号是回文日\n",year,month,day);
i++;//统计一共多少个回文日
}
}
}
}
printf("总计有%d个回文日",i);
return 0;
}
最后照课后题补充一段代码:限定了2015-2100 可以直接确定日期为2号,不用计算闰年
/*回文日*/
#include <stdio.h>
int main()
{
int year,e,month,h=0;
for(year=2015;year<2100;year++)//明显的2100是没有对应回文日的
{
month=(year%10)*10+(year%100)/10;
e=2;//本世纪,扣掉2100,说明只能是20,反过来日期就是2号
if(month<=12)
{
printf("%d年的%02d月%02d号是回文日\n",year,month,e);
h++;
}
}
printf("总计有%d个回文日",h);
return 0;
}
月份反求:
/*回文日*/
#include <stdio.h>
int main()
{
int year,e=2,month,h=0;
for(month=1;month<=12;month++)
{
year=e*1000+(month%10)*10+(month/10);
printf("%d年的%02d月%02d号是回文日\n",year,month,e);
h++;
}
printf("总计有%d个回文日",h);
return 0;
}
好了 今天就到这里了,明天开始新的一节课学习