计算1~n之间的特殊数: ①回文数;②素数;③亲密数;④水仙花数。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int huiwen(char m[],int len)//传入字符串m和它的长度
{
    int i, j = 0;
    char *M;
    M = (char *)malloc(sizeof(char)*(len + 1));//生成动态数组
    for (i = len - 1; i>-1;i--)
    {
        M[j++] = m[i];

    }
    M[j] = '\0';//将数组以\0结尾变为字符串形式
    if (strcmp(m, M) == 0)
        return 1;
    else
        return 0;
    free(M);//释放空间
}
int sushu(int x)//判断X是不是素数
{
    int i;
    for (i = 2; i <= sqrt(x);i++)//sqrt是开方
    {
        if (x%i== 0)
            return 0;
    }

    return 1;

}
int qinmishu(int x, int y)//判断 x y是不是亲密数
{
    int sum = 0, sum2 = 0;
    int i, j;
    for (i = 1; i <= x / 2; i++)
    {
        if (x%i== 0)
            sum += i;//求x的因子之和
    }
    for (j = 1; j <= y / 2; j++)
    {
        if (sum%j == 0)
            sum2 += j;//求y的因子之和
    }
    if (sum2 == x&&sum ==y)//满足条件返回真(1)否者返回假(0)
        return 1;
    else
        return 0;
}
int shuixianhua(int x)//判断是不是水仙花数
{
    int a, b, c, sum;
    a = x / 100;//取百位
    b = (x - a * 100) /10;//取十位
    c = x % 10;//取个位
    sum = a*a*a + b*b*b + c*c*c;//求和
    if (sum == x)
        return 1;
    else
        return 0;
}
int main()
{
    int a, b, c, d, len, num;
    int i, j,n;
    char *s, *m;
    s = (char *)malloc(sizeof(char) * 10);
    m = (char *)malloc(sizeof(char) * 10);
    printf("请输入一个数;\n");
    scanf("%s",s);
    printf("请选择需要输出的结果:\n");
    printf("0.退出\n1.回文数\n2.素数\n3.亲密数\n4.水仙花数\n");
    scanf("%d",&n);
    num = atoi(s);//将字符串变为整型数
    printf("%s以内的",s);
    switch (n)
    {
    case 0: {printf("退出程序....\n"); return 0; }
    case 1:{printf("回文数:\n");
            for (i = 1; i <= num; i++)
          {
             m = itoa(i, m, 10);//将整型数变为字符串
              len = strlen(m);
            a = huiwen(m, len);
            if (a == 0)
             printf("");
            else
            printf("%d ",i);

          }
    }break;
    case 2:
       {
           printf("素数:\n");
          for (i = 2; i <= num; i++)
             {
                b = sushu(i);
                 if (b == 0)
                printf("");
              else
           printf("%d ",i);

             }
    }break;
    case 3: {printf("亲密数:\n");
    for (i = 1; i <= num; i++)
         {
        for (j = i+1; j <=num; j++)
          {
            c = qinmishu(i, j);
            if (c == 0)
                printf("");
            else
                printf("(%d %d)", i, j);
           }

         }

    }break;
case 4: {printf("水仙花数:\n");
    for (i = 100; i <= 999; i++)
    {
        d = shuixianhua(i);
        if (d == 0)
            printf("");
        else
            printf("%d ",i);
    }

    }
        break;
    }


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值