生成元

刘汝佳算法书—生成元

#include<stdio.h>
#include<string.h>
#define max 100005
int ans[max];

int main( )
{
    int T,n;
    memset(ans,0,sizeof(ans));
    for(int i =1; i < max;i++)
    {
        int a = i,y = 0;
        while(a > 0)
        {
            y += a % 10;
            a = a / 10;

        }
        y = y + i;
        if(ans[y] == 0 || i < ans[y])//这个判断语句是为了让生成元取到最小值
        {
            ans[y] = i;//这里其实就是交换了位置,因为后面输出的就是生成元,i就是生成元(较小的那个),循环完成的任务就是计算生成元对应的数,大概可以折磨理解
        }
    }
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        printf("%d\n",ans[n]);
    }
    return 0;
}

其实可以对于每个输入的数字,进行枚举从1···这个数-1,但是这样太麻烦,效率也不高,最好就是,先进行枚举,然后计算每一个数对应的生成元,又因为是数字,所以可以采用数字、组来完成记录,又因为输出的是小的生成元,所以计算出来后交换一下位置就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值