频道栏目
首页 > 程序开发 > 软件开发 > C语言 > 正文
问题四十八: 2011年11月02日是一个回文日:2011 1102,我还记得我和2011级的同学在这一天一起做这个题的时候!请列出近80
2013-04-26 09:07:46      个评论      
收藏   我要投稿

[plain]
/* 程序头部注释开始(为避免提交博文中遇到的问题,将用于表明注释的斜杠删除了)      
* 程序的版权和版本声明部分      
* All rights reserved.      
* 文件名称: txt.c      
* 作    者: liuyongshui      
* 问    题:  2011年11月02日是一个回文日:2011 1102,我还记得我和2011级的同学在这一天一起做这个题的时候! 
             请列出近80还有多少个回文日 
  
* 完成日期: 2013 年4 月14日      
* 版 本 号: V1.0      
*/     
 
#include <stdio.h> 
 
const int Day[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 
int CheckYear(int year);   //检测是否为闰年或平年 
int CompareNum(int num1[], int num2[]);   // 比较是否为回文日 
 
int main() 
{     
      int i; 
      int num=1;       //计数 
      int sign=0;      //标记 
      int flag;         
      int mark; 
      int j=0; 
      int l=0; 
      int m=0; 
      int n; 
      int year[4]={0}; 
      int monthday[4]={0}; 
 
      for(i=2011; i<=2091; i++)    //近80年 
      {    
          flag=i;    //此处的用flag替代i,因为下面flag=flag/10语句会改边flag,如果不替换,会出错的。 
 
          for(j=0; j<4; j++)   //把年的每一位放入数组year 
          { 
             year[j]=flag%10;     
             flag=flag/10; 
          } 
          for(l=1; l<=12; l++)  
          {    
              mark=l;    // 也是替代l 
 
              for(n=1; n<=Day[l]; n++) 
              {    
                  m=0;          //每执行一次,就把m赋为0 
                  sign=0;      //每执行一次,就把sign赋为1 
 
                  if(n<10)       // (n<10) 
                  { 
                      monthday[m++]=n;   
                      monthday[m++]=0; 
                  } 
                  else     //取第几天(>=10)的每一位(如 10 ,就取 1 和 0) 
                  { 
                      monthday[m++]=n%10;   //取每一位 
                      monthday[m]=n/10%10; 
                  } 
 
                 if(l==2 && CheckYear(i))    //若果是闰年1 且为二月 就加一。 
                    { 
                     monthday[0]+=1;              
                    } 
 
                 if(l<10)   //取第几月(>=10)的每一位(如 10 ,就取 1 和 0) 
                 {   
                     m=2;    //让从m=2开始赋值 
 
                     monthday[m++]=l;       //取每一位 
                     monthday[m++]=0; 
                  } 
                  else      // (n<10) 
                  {    
                      m=2;    //让从m=2开始赋值 
 
                      monthday[m++]=mark%10;        //取每一位 
                      monthday[m]=mark/10%10; 
                  } 
               
                  if(CompareNum(year, monthday))     // 比较是否为回文日,若是真 
                  {     
                       if(l==2 && CheckYear(i) )     //若果是闰年1 且为二月 就加一 
                       {    
                           sign=1;           //是回文日sign赋为1 
                           printf("第%d个 %5d %5d %5d 是回文日.", num++, i, l, n+1);     
                       } 
                       else  
                       {    
                           sign=1;          //是回文日sign赋为1 
                           printf("第%d个 %5d %5d %5d 是回文日.", num++, i, l, n); 
                       } 
                  } 
                  
                  if(sign==1)  //若果为真,即有回文日 
                  { 
                      printf("\n"); 
                  } 
              } 
 
          } 
 
      } 
       
      return 0; 

 
 
//函数申明 
int CheckYear(int year) 

    if((year%100 !=0 && year%4 ==0) || (year%400 ==0))   //若符合条件,为闰年,返回1 
    { 
         return 1;          
    } 
    else    
    { 
         return 0; 
    } 

 
int CompareNum(int num1[], int num2[]) 
{     
     int i; 
     int j=3; 
 
     for(i=0, j=3; i<4, j>=0; i++, j--) 
     { 
         if(num1[i]!=num2[j])    //num1从开始的每一位与num2从最后一位往前比较,若不等返回0 
         { 
            return 0; 
         } 
     } 
     return 1; 

/* 程序头部注释开始(为避免提交博文中遇到的问题,将用于表明注释的斜杠删除了)    
* 程序的版权和版本声明部分    
* All rights reserved.    
* 文件名称: txt.c    
* 作    者: liuyongshui    
* 问    题:  2011年11月02日是一个回文日:2011 1102,我还记得我和2011级的同学在这一天一起做这个题的时候!
             请列出近80还有多少个回文日

* 完成日期: 2013 年4 月14日    
* 版 本 号: V1.0    
*/   

#include <stdio.h>

const int Day[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int CheckYear(int year);   //检测是否为闰年或平年
int CompareNum(int num1[], int num2[]);   // 比较是否为回文日

int main()
{   
   int i;
   int num=1;       //计数
   int sign=0;      //标记
   int flag;       
   int mark;
   int j=0;
   int l=0;
   int m=0;
   int n;
   int year[4]={0};
   int monthday[4]={0};

   for(i=2011; i<=2091; i++)    //近80年
   {  
    flag=i;    //此处的用flag替代i,因为下面flag=flag/10语句会改边flag,如果不替换,会出错的。

       for(j=0; j<4; j++)   //把年的每一位放入数组year
    {
       year[j]=flag%10;   
    flag=flag/10;
    }
          for(l=1; l<=12; l++)
    {  
     mark=l;    // 也是替代l

     for(n=1; n<=Day[l]; n++)
     {  
      m=0;          //每执行一次,就把m赋为0
      sign=0;      //每执行一次,就把sign赋为1

      if(n<10)       // (n<10)
      {
          monthday[m++]=n; 
       monthday[m++]=0;
      }
         else     //取第几天(>=10)的每一位(如 10 ,就取 1 和 0)
      {
             monthday[m++]=n%10;   //取每一位
             monthday[m]=n/10%10;
      }

                 if(l==2 && CheckYear(i))    //若果是闰年1 且为二月 就加一。
     {
            monthday[0]+=1;            
     }

           if(l<10)   //取第几月(>=10)的每一位(如 10 ,就取 1 和 0)
     { 
      m=2;    //让从m=2开始赋值

      monthday[m++]=l;       //取每一位
      monthday[m++]=0;
      }
      else      // (n<10)
      {  
       m=2;    //让从m=2开始赋值

       monthday[m++]=mark%10;        //取每一位
       monthday[m]=mark/10%10;
      }
    
      if(CompareNum(year, monthday))     // 比较是否为回文日,若是真
      {   
        if(l==2 && CheckYear(i) )     //若果是闰年1 且为二月 就加一
        {  
         sign=1;           //是回文日sign赋为1
         printf("第%d个 %5d %5d %5d 是回文日.", num++, i, l, n+1);   
        }
        else
        {  
         sign=1;          //是回文日sign赋为1
         printf("第%d个 %5d %5d %5d 是回文日.", num++, i, l, n);
        }
      }
    
      if(sign==1)  //若果为真,即有回文日
      {
       printf("\n");
      }
     }

    }

   }
     
      return 0;
}


//函数申明
int CheckYear(int year)
{
    if((year%100 !=0 && year%4 ==0) || (year%400 ==0))   //若符合条件,为闰年,返回1
 {
      return 1;        
 }
 else  
 {
      return 0;
 }
}

int CompareNum(int num1[], int num2[])
{   
  int i;
  int j=3;

     for(i=0, j=3; i<4, j>=0; i++, j--)
  {
      if(num1[i]!=num2[j])    //num1从开始的每一位与num2从最后一位往前比较,若不等返回0
   {
      return 0;
   }
  }
  return 1;
}
        

 \

点击复制链接 与好友分享!回本站首页
上一篇:问题四十七: 有等式[※×(※3+※)]2=8※※9,其中※处为1个数字,滴上了墨水无法辨认
下一篇:问题四十九: 现在北京有一套房子,价格200万,假设房价每年上涨10%( 每年上涨的的价格是在200万基础上),一个软件工程师每年固定
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站