07.07C

【项目1-完数】
一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3,再如8的因子和是7(即1+2+4),8不是完数。
(1)输入一个数n,判断n是否是完数
(2)输出1000以内的所有完数
(3)亲密数:如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。(提示:按照亲密数定义,要判断数a是否有亲密数,只要计算出a的全部因子的累加和为b,再计算b的全部因子的累加和为n,若n等于a则可判定a和b是亲密数。)

解法:

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int iXin;//输入的数字
    int i;
    int sum;
    int m;
    printf("please input a number:");
    scanf("%d",&iXin);//读入输入数字
    for(m=2;m<=iXin;++m)
    {
    for(i=1;i<m;++i)
    {
        if (m%i==0)
            sum=sum+i;
    }
        if(sum==m)
    printf("%d ",m);
    sum=0;
    }
    return 0;
}

【项目2 - n=a!+b!+c!】
求满足条件n=a!+b!+c!的所有三位数n并输出,其中a,b,c分别为n的百、十、个位数。

解法:

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int n,m;
    int a,b,c;//个位数,十位数,百位数
    int iMulti_a,iMulti_b,iMulti_c;
    int sum;
    int i,j,k;
    printf("please enter a number less than 1000:");
    scanf("%d",&n);
    for (m=144;m<=n;++m)
    {
    a=m%10;
    b=(m/10)%10;
    c=m/100;
     iMulti_a=1;
     iMulti_b=1;
     iMulti_c=1;
         sum=0;
         if(a!=0)
         {
     for(i=1;i<=a;++i)
     {
         iMulti_a = iMulti_a*i;
     }
         }
         else iMulti_a=0;
     sum+=iMulti_a;
     if(b!=0)
     {
      for(j=1;j<=b;++j)
     {
         iMulti_b =iMulti_b*j;
     }
     }
     else iMulti_b=0;
      sum+=iMulti_b;
      if(c!=0)
      {
      for(k=1;k<=c;++k)
     {
         iMulti_c =iMulti_c * k;
     }
      }
      else iMulti_c=0;
      sum+=iMulti_c;
     if(sum==m)
    printf("%d",m);
    }
    return 0;
}

【项目3-反序数】
(1)输入一个正整数,输出它的反序数(反序数,即将其所有位的数字反过来。例如,123是321的反序数)
(2)求1000000以内的正整数n,要求9n是n的反序数。

解法:

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int n;//输入整数
    int m;
    int k;
for(n=1;n<=1000000;++n)
{
        k=n;
        m=0;
    while(k>0)
    {
        m=10*m+k%10;
        k=k/10;
    }
    if(m==9*n)
        printf("%d ",n);
}
printf("\n");
    return 0;
}

【项目4-回文数】
(1)输入一个正整数,判断其是否为一个回文数(例1221、12321都是回文数,正着看、倒着看,是同一个数)。
(2)输出10000以内的所有回文数。

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int n,m;
    int iReverse_n;
    int k;
    printf("please enter a number n:");
    scanf("%d",&n);
    for (m=1;m<=n;++m)
    {
        k=m;
        iReverse_n=0;
        while(k>0)
        {
            iReverse_n=10*iReverse_n+k%10;
            k=k/10;
        }
        if(iReverse_n==m)
            printf("%d ",m);
    }
    return 0;
}

//任意输入数字以内所有的回文数

【项目5-阿姆斯特朗数】
如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。如 407=43+03+73就是一个阿姆斯特朗数。试编程求1000以内的所有阿姆斯特朗数。

解法:

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int n,m;
    int iA_n;
    int a;
    int k;
    printf("please enter a number:");
    scanf("%d",&n);
    for(m=1;m<=n;++m)
    {
        iA_n=0;
        a=0;
        k=m;
        while(k>0)
        {
            a=k%10;
            iA_n=iA_n+(a*a*a);
            k=k/10;
        }
        if(iA_n==m)
            printf("%d ",m);
    }
    return 0;
}

【项目6-回文日】
很有趣的一个题目:2011年11月02日是一个回文日:2011 1102,在2011级同学做这道题时我们刚刚度过这一天!请列出本世纪还有多少个回文日(假如我们能活到百岁,你和我的……)。注意:一年只有12个月。

解法:

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int iData;//输入日期的上限
    int iYear,iMonth,iDay;//分离日期的年 月 日
    int iData_n;//迭代日期
    int iReverse_data;//回文日期
    int a;//时间表达式
    int k;//分离日期的各位数
    printf("please enter a upper limit of the data:");
    scanf("%d",&iData);
    for (iData_n=20111301;iData_n<=iData;++iData_n)
    {
        iYear=iData_n/10000;
        iMonth=iData_n/100%100;
        iDay=iData_n%100;
        iReverse_data=0;
        k=iData_n;
        if(iMonth>0&& iMonth<=12)
        {
        if(iMonth==1||iMonth==3||iMonth==5||iMonth==7||iMonth==8||iMonth==10||iMonth==12)
            a=1;
        else if(iMonth==4||iMonth==6||iMonth==9||iMonth==11)
            a=2;
        else if(iMonth==2)
            a=3;
        }
        else continue;
        switch(a)
        {
    case 1:
        {
           if(iDay>0&&iDay<=31)
           {
               while(k>0)
               {
                   iReverse_data=10*iReverse_data+k%10;
                   k=k/10;
               }
           }
           if(iReverse_data==iData)
            printf("%d" ,iData);
        }
    case 2:
        {
          if(iDay>0&&iDay<=30)
           {
               while(k>0)
               {
                   iReverse_data=10*iReverse_data+k%10;
                   k=k/10;
               }
           }
           if(iReverse_data==iData)
            printf("%d" ,iData_n);
        }
    case 3:
        {
        if(iYear%4==0 && iYear%400==0)
        {
          if(iDay>0&&iDay<=29)
           {
                while(k>0)
               {
                   iReverse_data=10*iReverse_data+k%10;
                   k=k/10;
               }
           }
           if(iReverse_data==iData)
            printf("%d" ,iData);
        }
        else
        {
           if(iDay>0&&iDay<=28)
           {
                while(k>0)
               {
                   iReverse_data=10*iReverse_data+k%10;
                   k=k/10;
               }
           }
           if(iReverse_data==iData_n)
            printf("%d ",iData_n);
        }
    }
        }
 }
     return 0;
}












































































































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值