39节课后3解

来源:互联网 发布:淘宝口令是什么意思啊 编辑:程序博客网 时间:2024/06/07 03:19

项目五

代码:

/*阿姆斯特朗数*/#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;    }



好了   今天就到这里了,明天开始新的一节课学习


0 0