紫书例题3-5 生成元

题目 一个数字x加上它各个位数得到数字y,那么x是y的生成元(x一通操作得到y) 比如120的生成元之一(可能?)是114.

给出一个数字n(1<=n<=100000),求最小生成元。

朴素做法,枚举n-1前每个数字的生成元,看它能否等于你要求的数字。 然后看一下数字n=1e5,我感觉没戏..

再想,我能不能把每个数字(x)能生成的y记录下来形成一种二元关系.然后它问哪个,我就查表给哪个就完事了,然后复杂度是O(n)吧

然后核心部分,至于中间某变量为什么叫xxxxx,我第一次做用的i,然后在循环里改变了i的值,然后华丽死循环出不来了.

for(i=1;i<=100000;i++){ int sum=0;dashabi=i;
	while(dashabi){ temp=dashabi%10;dashabi/=10;sum+=temp;
	} 
p[i+sum].push_back(i);
}

这里用了vector, p[i+sum][k],然后让k=0,for k to p[i+sum].size(),就能遍历p[i+sum]的生成元,最后选出最小值

完整代码

#include<iostream>
#include<vector>
using namespace std;
vector<int> p[130000]; 
int main(){ int i,j,k,temp,n,m,len,min,dashabi;
for(i=1;i<=100000;i++){ int sum=0;dashabi=i;
	while(dashabi){ temp=dashabi%10;dashabi/=10;sum+=temp;
	} 
p[i+sum].push_back(i);
} cin>>n;
for(i=1;i<=n;i++){ cin>>k;
len=p[k].size(); if(len==0) { cout<<'0'<<endl; continue;
}long long min=1145141919; for(j=0;j<len;j++) { if(p[k][j]<min) min=p[k][j]; 
} cout<<min<<endl;  	
}

return 0;}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

minato_yukina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值