問5 GCD and LCM
解法
公式通りgcdとlcmを計算するだけです。
#include<stdio.h>
int gcd ( int a, int b ){
int c;
while ( a != 0 ) {
c = a; a = b%a; b = c;
}
return b;
}
int main(){
int g,a,b;
while(scanf("%d %d",&a,&b)!=EOF){
g=gcd(a,b);
printf("%d %d\n",g,a*(b/g));
}
}
問6 Reverse Sequence
解法
文字列を逆順に表示するだけです。
#include<stdio.h>
#include <string.h>
int main(){
char str[21];
scanf("%s",str);
for(int i=strlen(str)-1;i>=0;i--)printf("%c",str[i]);
printf("\n");
}
問7 Debt Hell
#include<stdio.h>
int main(){
int n,m=100000;
scanf("%d",&n);
while(n--){
m*=1.05;
if(m%1000>0){
m+=1000-(m%1000);
}
}
printf("%d\n",m);
}
問8 Sum of 4 Integers
解法
最初に全部の場合の答えを初歩的な動的計画法で求めます。
計算量は大差ないので4重ループで求めてもよいでしょう。
#include<stdio.h>
int main(){
int ans[51]={0},n;
ans[0]=1;
for(int i=0;i<4;i++){
for(int k=36;k>=0;k--){
for(int j=1;j<=9 && k-j>=0;j++){
ans[k]+=ans[k-j];
}
}
}
while(scanf("%d",&n)!=EOF){
printf("%d\n",ans[n]);
}
}
問9 Prime Number
解法
篩で選り分けてあとは下からカウントするだけです。
count配列のメモリ使用量がもったいない感じですがあまり気にしません。
#include<stdio.h>
#include<math.h>
#include<string.h>
const int limit=1000001;
bool is_prime[limit];
int count[limit]={0};
void calc(){
//エラトステネスの篩
memset(is_prime,true,sizeof(is_prime));
is_prime[0]=is_prime[1]=false;
for(int i=2;i<=sqrt(limit);i++){
if(is_prime[i]==false)continue;
for(int j=i*2;j<limit;j+=i){
is_prime[j]=false;
}
}
//素数の個数のカウント
for(int i=1;i<limit;i++){
count[i]=count[i-1]+is_prime[i];
}
}
int main(){
int n;
calc();
while(scanf("%d",&n)!=EOF){
printf("%d\n",count[n]);
}
}
最終更新:2014年01月11日 04:24