1. 3の倍数と5の倍数をたす(1000未満)
int main(void){ int sum(0); REP(i,1,1000) if(i % 3 == 0 || i % 5 == 0) sum+=i; cout << sum << endl; return 0; }
2. フィボナッチ数列で偶数の値のものをたす(4000000以下まで)
#define smax 10000000 int dp[smax]; int main(void){ dp[0] = 1; dp[1] = 2; int sum=0; REP(i,2,smax){ dp[i] = dp[i-1]+dp[i-2]; if(dp[i] >= 4000000) break; if(dp[i] %2 == 0 ) sum += dp[i]; } cout << sum+2 << endl; return 0; }
3.素因数のなかで一番大きいものを出力する
int main(void){ map<ll,ll,greater<ll> > ma; ll num = 600851475143; int i=2; for(;;){ if(num == 1) break; if(num % i == 0){ num /= i; ma[i]++; } else i++; } map<ll,ll>::iterator it = ma.begin(); cout << it->first << endl; return 0; }
4.3桁の2つの数の積で回文であるもののなかの最大の値をだす。
わざわざvectorに保存する必要がなかったと思ったw
#include<boost/lexical_cast.hpp> int solve(string str){ int cnt=0; bool flag = false; rep(i,str.size()/2){ if(str[i] == str[str.size()-i-1]) cnt++; else{ flag = true; break; } } if(flag) return 0; else return 1; } int main(void){ ll s; string str; vector<int> ve; for(int i=999;i>99;i--){ for(int j=i;j>99;j--){ s = i*j; if(1 == solve(str = boost::lexical_cast<string>(s))){ ve.push_back(atoi(str.data())); } } } sort(ALL(ve),greater<int>()); cout << ve[0] << endl; return 0; }
5.1から20までの値全てで割れる値の最小値をだす
int solve(int a){ for(int i=20;i>0;i--){ if(a%i == 0) continue; else return 0; } return 1; } int main(void){ for(int i=20;;i++){ if(1 == solve(i)){ cout << i << endl; break; } } return 0; }