Project Euler 21-25题
来源:互联网 发布:舒缦水暖床垫淘宝网 编辑:程序博客网 时间:2024/06/05 07:49
第21题
题目来源ProjectEuler
这个题定义了一个函数
求小于10,000的所有满足
首先求所有数不为本身的因子的和。如果一个数一个数去分解,复杂度将会是
然后枚举1至n的所有数
int d[10001];int main(){ int n=10000; for (int i=1;i<=n;i++){ for (int j=i*2;j<=n;j+=i){ d[j]+=i; } } int ans=0; for (int i=1;i<=n;i++){ if (d[i]!=i&&d[i]<=n&&d[d[i]]==i){ ans+=i; } } cout<<ans<<endl; return 0;}
第22题
题目来源ProjectEuler
题中txt地址:https://projecteuler.net/project/resources/p022_names.txt
这个题是给你超过5000个名字(其实是5163个),将所有名字按字典序排序后,求
这道题最最坑爹的地方是,题中没有说明
我原来想过使用hash的方法用整型表示每个名字的字典序的,但是没找到很好的hash函数。结果就只能每次直接比较名字的字典序,复杂度变成了
struct Name{ char s[20]; int sum; Name(){sum=0;}}name[10500];bool cmp(Name a,Name b){return strcmp(a.s,b.s)<0;}int main(){ int cnt=-1; freopen("in.txt","r",stdin); while(scanf("%s",name[++cnt].s)!=EOF){ for (int i=0;name[cnt].s[i];i++){ name[cnt].sum+=name[cnt].s[i]-'A'+1; } } sort(name,name+cnt+1,cmp); long long ans=0; for (int i=0;i<=cnt;i++){ ans+=i*name[i].sum; } cout<<ans<<endl; return 0;}
第23题
题目来源ProjectEuler
定义 abundant number为所有非己因数和大于自己的数。
题目中告知大于28213的所有数都可以表示成两个abundant number的和。
问所有正数中不能被表示成两个abundant number的数的和。
使用类似21题的做法,求出小于28213的所有数的非己因数和,将非己因数和大于自身的数加入到vector里面,做一个
int num[30000];vector<int> v;int isable[30000];int main(){ int n=28123; memset(num,0,sizeof(num)); memset(isable,0,sizeof(num)); for (int i=1;i<=n;i++){ for (int j=i*2;j<=n;j+=i){ num[j]+=i; } } for (int i=1;i<=n;i++){ if (num[i]>i) { v.push_back(i); } } for (int i=0,maxn=v.size();i<maxn;i++){ for (int j=i;j<maxn&&v[i]+v[j]<=n;j++){ isable[v[i]+v[j]]=1; } } int ans=0; for (int i=1;i<=n;i++){ if (isable[i]==0) ans+=i; } cout<<ans<<endl; return 0;}
第24题
题目来源ProjectEuler
这个题是求0123456789这九个数在字典序下的第1,000,000个全排列
利用c++的next_permutation()函数循环999,999次即可。并且这一函数可以作用于char数组。
int main(){ char num[]={'0','1','2','3','4','5','6','7','8','9','\0'}; for (int i=1;i<1000000;i++){ next_permutation(num,num+10); } cout<<num<<endl; return 0;}
第25题
题目来源ProjectEuler
这个题是求第一个达到1000位十进制数的斐波那契项的下标。
1000位也就是
利用long double可以记录
求斐波那契数列的每一项,直到结果大于
int main(){ long double f1=1,f2=1,f=1; int index=2; long double maxx=1; for (int i=1;i<=999;i++) maxx*=10; for (;f<maxx;){ index++; f=f1+f2; f1=f2;f2=f; } cout<<index<<endl; return 0;}
- Project Euler 21-25题
- Project Euler 21~25
- Project Euler - Problem 21
- Project Euler - Problem 21
- Project Euler problem 21
- Project Euler 21
- Project Euler Problem 21
- project euler 21
- Project Euler - Problem 25
- Project Euler Problem 25
- Project Euler problem 25
- Project Euler 25
- project euler Problem 25
- project euler 25
- Project Euler 24 25
- Project Euler 25
- project euler第一题
- Project Euler第二题
- 区间第k大(主席树)
- 数据结构之顺序表的使用
- bzoj2002Bounce 弹飞绵羊 动态树(Link-Cut-Tree)
- SDUT_2122 数据结构实验之链表七:单链表中重复元素的删除
- 51nod 1419 最小公倍数挑战
- Project Euler 21-25题
- Python实现插入排序
- 算法分析与复杂性原理 第一次上机 棋盘问题
- 达内课程-API(java.lang.Object和java.lang.String)
- css3 圆角
- java原生序列化和Kryo(dubbo)序列化性能比较
- CODEVS 1011 数的计算 & 2001NOIP普及组T1
- 洛谷 P1944 最长括号匹配_NOI导刊2009提高(1)
- jsp九大类值对象四大作用域