Project Euler 36-40题
来源:互联网 发布:哪个听书软件最好 编辑:程序博客网 时间:2024/06/07 11:52
第36题
题目来源ProjectEuler
这一题求的是小于1,000,000的所有数中,在十进制和二进制表示下都是回文数的数的和。
枚举每个数,检验即可,复杂度
另一种方法,可枚举前一半的位上的数字,然后将整个数加上去,由于这样产生的所有数都是结果的一部分,省去了许多冗余的运算,会更快一些。但是代码复杂度更高一些。
我使用的是第一种方法:
#include<bits/stdc++.h>using namespace std;bool check(int x){ int a[25]={0}; int tmp=x,cnt=0; while(tmp){ a[++cnt]=tmp%10; tmp/=10; } for (int i=1;i<=cnt;i++){ if (a[i]!=a[cnt-i+1]) return false; } tmp=x;cnt=0; while(tmp){ a[++cnt]=tmp&1; tmp>>=1; } for (int i=1;i<=cnt;i++){ if (a[i]!=a[cnt-i+1]) return false; } return true;}int main(){ long long ans=0; for (int i=1;i<1000000;i++){ if (check(i)) ans+=i; } cout<<ans<<endl; return 0;}
第37题
题目来源ProjectEuler
这一题是有所有这样素数的和:1.它不是一位数、2.它的所有前缀和后缀都是素数
题目中保证了结果只有11个素数的和,但没有指明最大值。只能尝试着利用线性筛求出1000w以内的所有素数,从小到大依次检查,直到检查出11个为止。
#include<bits/stdc++.h>using namespace std;const int maxn=10000000;int prime[maxn+1],cnt;int num[maxn+1];bool check(int x){ for (int i=10;i/10<x;i*=10){ if (num[x%i]) return false; } while(x){ if (num[x]) return false; x/=10; } return true;}int main(){ cnt=0; num[1]=1; for(int i=2;i<=maxn;i++){ if(num[i]==0) prime[++cnt]=i; for (int j=1;j<=cnt&&i*prime[j]<=maxn;j++){ num[i*prime[j]]=1; } } int n=0,ans=0; for (int i=5;n<11;i++){ if (check(prime[i])){ n++;ans+=prime[i]; } } cout<<ans<<endl; return 0;}
第38题
题目来源ProjectEuler
对于1-9的全排列构成的所有数,有一部分数可以表示成
由于要求
#include<bits/stdc++.h>using namespace std;long long maxx,x;void check(){ int num[10]={0},cnt=0,tmp=x; num[0]=1; while(tmp){ if (num[tmp%10]==0) cnt++; else return; num[tmp%10]=1; tmp/=10; } if (cnt==9){ maxx=max(maxx,x); }}int main(){ for (int i=1;i<=9999;i++){ x=0; for (int j=1,tmp,mul=1;j<=9;j++){ tmp=i*j; while((x*mul+tmp)/mul!=x) mul*=10; x=x*mul+tmp; if (x>1e9) break; check(); } } cout<<maxx<<endl; return 0;}
第39题
题目来源ProjectEuler
当一个直角三角形周长
如果枚举所有p以及两条直角边,检查是否满足题意,这是可行的,但这个是
考虑所有的直角三角形,可将他们划分为两类:1.三边互质的直角三角形;2.三边具有一个非1公因子的直角三角形。
显然,第二类直角三角形的三条边除以其最大公因子即可得到第一类直角三角形。我们称其为本原勾股数。
我们定义一对互质的数
我们每得到一组本原勾股数
#include<bits/stdc++.h>using namespace std;const int maxp=1000;int num[1001];int gcd(int a,int b){return b==0? a:gcd(b,a%b);}int main(){ for (int i=1;i<=500;i++){ for (int j=1;j<i&&2*i*j+2*i*i<=1000;j++){ if (gcd(i,j)==1){ num[2*i*j+2*i*i]++; } } } int p=1000,maxn=0,ans; for(int i=1;i<=p;i++){ int tmp=0; for (int j=1;j<=p;j++){ if (i%j==0){ tmp+=num[j]; } } if (tmp>=maxn){ ans=i;maxn=tmp; } } cout<<ans<<endl; return 0;}
第40题
题目来源ProjectEuler
这题将
第一种方法,从小到大枚举每一个数,记录当前所有数的长度,记录题中所求位置的数字,乘起来。复杂度
当然我们可以有更快的方法,也就是第二种。
我们很容易算出小于
然后我们对于题中的每一个数aim,依次进行二分查找位置,当当前查找区间为
对于
此外对于
对于其他情况,我们查找
整体复杂度
#include<bits/stdc++.h>using namespace std;int tot[10],num[10];int search(int aim,int l,int r){ int mid=(l+r)/2; int len=0; while(mid){mid/=10;len++;} mid=(l+r)/2; if ((mid-num[len-1])*len+tot[len-1]-len>=aim) return search(aim,l,mid); else if ((mid-num[len-1])*len+tot[len-1]>=aim){ int diff=(mid-num[len-1])*len+tot[len-1]-aim; while(diff){ diff--; mid/=10; } return mid%10; } else return search(aim,mid+1,r);}int main(){ tot[1]=9;num[1]=9;num[0]=0; for (int i=2;i<=7;i++){ num[i]=(num[i-1])*10+9; tot[i]=tot[i-1]+i*(num[i]-num[i-1]); } int ans=1; for (int x=1,i=1;i<=7;i++){ ans*=search(x,1,1000000); x*=10; } cout<<ans<<endl; return 0;}
- Project Euler 36-40题
- Project Euler 36~40
- Project Euler 36
- Project Euler Problem 36
- Project Euler problem 36
- Project Euler 36
- project euler Problem 36
- Python-Project Euler 36
- project euler 36
- Project Euler 36
- Project Euler Problem 40
- Project Euler problem 40
- Project Euler 40
- Python-Project Euler 40
- project euler 40
- project euler第一题
- Project Euler第二题
- project Euler第三题
- C++字符型指针无法输出的问题
- HTML转义字符大全 (换行,enter,所有特殊字符)
- hadoop2.7.3在集群中配置多个namenode(federation cluster)
- 17-9-29Unsupported major.minor version 52.0 报错处理方式
- Codeforces Round #436 (Div. 2)D. Make a Permutation! codeforces-864D. Make a Permutation!
- Project Euler 36-40题
- 【LensFlare镜头光晕】Unity3D奇葩实现
- Codeforces Round #436 (Div. 2)C. Bus codeforces 864C. Bus
- AfxBeginThread的基本用法
- 类型安全
- Spark 高级分析:第二章第1节Scala和数据科学家
- 弋果美语参与“捡回珍珠计划”,重拾孩子们的未来!
- linux 下显示一个文件中的某几行(中间几行)
- 最短路径算法