2017.6.26-2017.6.29
系统学习c++已四天
已完成题目主要有:
先说明一个网站:大家可以要求上去做题(但要交钱qaq)
http://www.gdgzoi.com/
我做了上述网站中的
1。课程1(1-10)超级简单的题目,一天30题没问题,适合初学者
2。综合测试(1)(2)题目还可以,打了一上午
题目如下:
1)给你2个分数,求他们的和a/b + c/d,并要求和为最简形式。
#include<iostream> using namespace std; int main() { int a,b,c,d; cin>>a>>b>>c>>d; int e=b*d; int f=a*d+c*b; int r=e%f; int ee=e; int ff=f; while (r!=0) { e=f; f=r; r=e%f; } cout<<ff/f<<" "<<ee/f; }
这题一定要注意取模时被除数放前面,不然出现分子为0情况,超级麻烦,(辗转相除法很经典。。。)
2)
考拉兹猜想,是指对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1。
如n = 6,根据上述数式,得出 6→3→10→5→16→8→4→2→1 。步骤中最高的数是16,共有8个步骤。现在给定任意整数a和b,问对所有a <= n <= b,一共经过多少步后才能都得到1,其中最高的数是多少。
#include<iostream> #include<cstdio> using namespace std; int main() { int a,b; cin>>a>>b; int c=0; int d=0; for (int i=a; i<=b; ++i) { int k=i; int max=0; int sum=0; while (k!=1) { sum+=1; if (k%2==0) k/=2; else k=k*3+1; if (k>max) max=k; } c+=sum; if (max>d) d=max; } cout<<c<<" "<<d; }
(简单模拟)
3)
小明今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大、小王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。小明决定去买体育彩票啦。
现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。
#include<iostream> #include<cstdio> using namespace std; int main() { int n,x; int max=0; int a[1001]; int k=0; cin>>n; int nn=n; for (int i=1; i<=n; ++i) { cin>>a[i]; if (a[i]==0) { k+=1; nn-=1; } } for (int i=1; i<=n-1; ++i) for (int j=i+1; j<=n; ++j) { if (a[i]>a[j]) { int k; k=a[i]; a[i]=a[j]; a[j]=k; } } int sum; for (int i=n-nn+1; i<=n-1; ++i) { int q; if (a[i]!=0) q=a[i+1]-a[i]; if (q!=1) {k=k-q+1;} } if (k==0) cout<<"So Lucky!"; else cout<<"Oh My God!"; }
(先计算有多少个0,再通过快排算两数之间差,顺子之间是1,但如果不是,能把0补上去是1,也是)
4)小明有n张卡片,每张卡片都有一个编号ai(ai>=0),但是这n张卡片中有一些编号是重复的,现在要你把它们按编号从小到大排好,重复的只需要留下一张,但需要统计每种编号的卡片出现的次数,想请你帮忙用编程来解决问题。
#include<iostream> #include<cstdio> using namespace std; int main() { int a[10001]; int n; int x; int max=0; for (int i=0; i<=10001; ++i) a[i]=0; scanf("%d\n",&n); for (int i=1; i<=n; i++) { cin>>x; if (x>max) max=x; a[x]+=1; } for (int i=0; i<=max; i++) { if (a[i]!=0) cout<<i<<" "<<a[i]<<endl; } }
(快排+模拟)
5)有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
#include<iostream> using namespace std; int main() { int n; cin>>n; cout<<n/2; }
(小学奥数)
6)
茵茵所在的合唱队共有n个人(n为奇数)。为了准备一次演出,老师开始为她们安排合唱队形了。
大家都知道,合唱队形通常是中间高两端低的。老师是这样安排他们的队形的:先让所有的同学按高个儿在前的顺序排成一队。然后,最高的那位同学单独站出来,这是合唱队形的中心,再让第二位同学站在她的左手边,让第三位同学站在她的右手边,再依次向两端安排其他人……
事先给定所有人的身高,请输出她们站成合唱队形之后的身高顺序。
#include<iostream> #include<cstdio> using namespace std; int main() { int n; int a[100]; scanf("%d\n",&n); for (int i=1; i<=n; ++i) { cin>>a[i]; } for (int i=1; i<=n-1; ++i) { for (int j=i+1; j<=n; ++j) { if (a[i]>a[j]) { int k; k=a[i]; a[i]=a[j]; a[j]=k; } } } for (int i=1; i<=n/2; ++i) cout<<a[i*2-1]<<" "; cout<<a[n]<<" "; for (int i=n/2; i>=1; --i) cout<<a[2*i]<<" "; }
(快排...)
7)
话说孙悟饭与乐平正在与刚造访地球的赛亚人贝吉塔交战,因为连贝吉塔的手下纳巴的实力也远在他俩之上,由于差距悬殊,乐平不得不设脱离战场,去寻找正在修炼中的悟空求救,而赛亚人一伙岂能让他们轻易逃脱,于是贝吉塔让纳巴去追乐平而着手对付孙悟饭。
假设乐平的速度是vp每秒,纳巴速度vd每秒,他俩与贝吉塔当时处在同一地点(无视孙悟饭),当纳巴觉察到乐平逃跑这一举动需要t秒反应时间,乐平会在此间全速离开,虽然看起来乐平毫无胜算,但是他有一招叫做太阳拳的绝招,一旦纳巴超越自己那一瞬间,他会使出太阳拳让纳巴失明,一旦使出该招,纳巴不得不立即回去找贝吉塔拿眼药水,即他必须返回原处,并且在那里闭目养神f秒之后,再重新追赶,作为一名力大无穷却智商奇低的选手,乐平这太阳拳屡试不爽,设刚开始与贝吉塔所在的地方为起点,该点离悟空修炼处相距为c,求乐平到达悟空处 最少需要使用几次太阳拳,如果乐平刚好到达悟空处,而纳巴正好追到,则该次无需使用太阳拳,因为悟空会帮你干掉纳巴。
#include<iostream> #include<cmath> using namespace std; int main() { double vp,vd,t,f,c; while(cin>>vp>>vd>>t>>f>>c) { int sum=0; double all=c/vp-t; double s=0; double d=0; if(vd<=vp) sum=0; else { d=vp*t/(vd-vp); s+=d; if(s>=all) sum=0; else { while(s<all) { sum++; s+=(d+f); d=(d*(vp+vd)+f*vp)/(vd-vp); s+=d; } } }cout<<sum<<'\n'; }return 0; }
(小学追及问题,计算距离和时间,在一定时间内,判断超过多少次)
(这七题属于较简单题目,具体题解网上大把,但作为c++蒟蒻,还是做了好久啊。。。)
这七题中有个重点:快排!!!调用数据库algorithm,sort(a,a+n);<数组a中前n个元素从小到大排>
但好像考试不给用qaq
3。多重循环专题
(这个无需解释。。直接上题)
经典题:大家都很熟悉哥德巴赫猜想,它的内容是:对于任意一个大于4的偶数,都可以分解为两个素数的和。虽然我们不能证明它,但我们可以编一个程序对于给定的大于4的偶数进行验证。现在我们的任务是:对于给定的大于4的偶数,找出它所有本质不同的分解式(分解为两个素数和的式),所谓本质相同也就是说两个式的素数如果一样,则不管顺序如何,都认为是本质相同的,如:24=5+19和24=19+5是本质相同的分解式。
#include<iostream> #include<cstdio> #include<iomanip> #include<cmath> using namespace std; bool sc(long long x); int main() { int n; while (cin>>n) { for (long long i=1; i<=n; ++i) { if (sc(i)) if (sc(n-i)) if (i<=n/2) cout<<n<<"="<<i<<"+"<<n-i<<endl; } } return 0; } bool sc(long long x) { if (x==0||x==1) return(false); if (x==2) return(true); for (long long i=2; i<=sqrt(x); ++i) { if (x%i==0) return(false); } return(true); }
4。字符串专题(难啊,好多细节要做,明天再写一篇单独的。。)(且g,j,k没写。。。)
5。课程二枚举4题
(暴力出奇迹。。。)