Volume 0 (0005-0009)
はい。
http://judge.u-aizu.ac.jp/onlinejudge/finder.jsp?volumeNo=0
0005: GCD and LCM
C++11
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; long long gcd(long long x,long long y){ while(x%y!=0){ long long tmp; tmp=x; x=y; y=tmp%y; } return y; } long long lcm(long long x,long long y){ return x*y/gcd(x,y); } int main(){ long long a,b; while(scanf("%lld %lld",&a,&b)!=EOF){ long long g,l; if(a<b){ swap(a,b); } g=gcd(a,b); l=lcm(a,b); printf("%lld %lld\n",g,l); } return 0; }
最小公約数と最大公倍数を。なるべくなら素で書けるのがいいのですが出来てないので毎回のように写経をするという無様な状況。。
0006: Reverse Sequence
C++11
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ char c[20]; scanf("%s",&c); string s=c; reverse(s.begin(),s.end()); printf("%s\n",s.c_str()); return 0; }
reverse(s.begin(),s.end());
でstringが反転出来るのをなるべく覚えておく。。
0007: Debt Hell
C++11
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int n,debt=100000; scanf("%d",&n); for(int i=0;i<n;i++){ debt=static_cast<int>(debt*1.05); if(debt%1000!=0){ debt=(debt/1000)*1000; debt+=1000; } } printf("%d\n",debt); return 0; }
どうやら複利計算らしい。。闇金おそろしい。。 毎週1.05倍にして1000円未満は切り上げれば、他には特に問題ないはず。
0008: Sum of 4 Integers
C++11
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int n; while(scanf("%d",&n)!=EOF){ int ans=0; for(int j=0;j<10;j++){ for(int k=0;k<10;k++){ for(int l=0;l<10;l++){ for(int m=0;m<10;m++){ if(j+k+l+m==n){ ans++; } } } } } printf("%d\n",ans); } return 0; }
他の人の回答を見ても4重ループか組み合わせ列挙しているので、特に何か省略する方法はないのかな??
0009: Prime Number
C++11
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; void pr(int n){ int ans=0; vector<bool> prime; for(int i=0;i<=n;i++){ prime.push_back(true); } prime[0]=prime[1]=false; for(int i=2;i<=n;i++){ if(prime[i]){ for(int j=2;j*i<=n;j++){ prime[i*j]=false; } } } for(int i=2;i<=n;i++){ if(prime[i]){ ans++; } } printf("%d\n",ans); } int main(){ int n; while(scanf("%d",&n)!=EOF){ pr(n); } return 0; }
素数の数え方でかなり早さに差がある。 今回は懐かしいvipprogramingのwikiからパクった。 http://vipprog.net/wiki/%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C/%E8%A7%A3%E7%AD%94%E4%BE%8B/%E7%B4%A0%E6%95%B0%E5%88%A4%E5%AE%9A/C%2B%2B.html