青色の部分が重要箇所を示している.
int main(void){
char buf[80];
int j;
int i;
int k;
gets(buf);
j = atoi(buf);
for(i=1; i<=j; i++){
k = j % i;
printf("%d %% %d = %d\n", j, i, k);
}
}
int main(void){
char buf[80];
int j;
int i;
int k;
gets(buf);
j = atoi(buf);
for(i=1; i<=j; i++){
k = j % i;
if(k == 0){
printf("%d\n", i);
}
}
}
int main(void){
char buf[80];
int j;
int i;
int k;
int n;
gets(buf);
j = atoi(buf);
n = 0;
for(i=1; i<=j; i++){
k = j % i;
if(k == 0){
n = n + 1;
}
}
printf("%d\n", n);
}
int main(void){
char buf[80];
int j;
int i;
int k;
int n;
gets(buf);
j = atoi(buf);
n = 0;
for(i=1; i<=j; i++){
k = j % i;
if(k == 0){
n = n + 1;
}
}
if(n == 2){
printf("%d is prime\n", j);
} else {
printf("%d is not prime\n", j);
}
}
int main(void){
char buf[80];
int j;
int i;
int k;
int n;
gets(buf);
j = atoi(buf);
if(j % 2 == 0){ /* 偶数の場合 */
if(j == 2){
printf("%d is prime\n", j);
} else {
printf("%d is not prime\n", j);
}
} else { /* 奇数の場合 */
n = 0;
for(i=3; (i*i)<=j; i += 2){
/* 除数の範囲を, j の平方根までの奇数に限定 */
k = j % i;
if(k == 0){
n = n + 1;
}
}
if(n == 0){
printf("%d is prime\n", j);
} else {
printf("%d is not prime\n", j);
}
}
}
さらに, 割り切れる場合がひとつでも見つかったらその先を計算しないプログラム. 「break文」は教科書 P.201 に説明があるが, 現在実行中のループから イキナリ脱出するためのものである.
int main(void){
char buf[80];
int j;
int i;
int k;
int n;
gets(buf);
j = atoi(buf);
if(j % 2 == 0){ /* 偶数の場合 */
if(j == 2){
printf("%d is prime\n", j);
} else {
printf("%d is not prime\n", j);
}
} else { /* 奇数の場合 */
n = 0;
for(i=3; (i*i)<=j; i += 2){
/* 除数の範囲を, j の平方根までの奇数に限定 */
k = j % i;
if(k == 0){
n = n + 1;
break; /* 割り切れたらfor文から脱出 */
}
}
if(n == 0){
printf("%d is prime\n", j);
} else {
printf("%d is not prime\n", j);
}
}
}
前の問題同様, 段階的に考えてみる.
int main(void){
char line[80];
int i,j, sum;
int k;
gets(line);
i = atoi(line);
gets(line);
j = atoi(line);
sum = 0;
for(k=i; k<=j; k++){
sum = sum + k;
}
printf("%d + ... + %d = %d\n", i, j, sum);
}
等差数列の和の公式を使ってsumを一気に計算するなら,
青色の部分は
とすればよい. (そしてこちらの方が繰り返しがないぶん高速)sum = (i+j)*(j-i+1)/2;
int main(void){
char line[80];
int i,j, sum;
gets(line);
j = atoi(line);
for(i=1; i<j; i++){
sum = (i+j)*(j-i+1)/2;
printf("%d + ... + %d = %d\n", i, j, sum);
}
}
合計の計算は等差数列の和の公式を使うことにした.
int main(void){
char line[80];
int i,j, sum;
int max_j;
gets(line);
max_j = atoi(line);
for(j=1; j<=max_j; j++){
for(i=1; i<j; i++){
sum = (i+j)*(j-i+1)/2;
printf("%d + ... + %d = %d\n", i, j, sum);
}
}
}
int main(void){
char line[80];
int i,j, sum;
int n;
gets(line);
n = atoi(line);
for(j=1; j<=n; j++){
for(i=1; i<j; i++){
sum = (i+j)*(j-i+1)/2;
if(n == sum){
printf("%d + ... + %d = %d\n", i, j, sum);
}
}
}
}
n = 0;
for(i=1; i<=j; i++){
k = j % i;
if(k == 0){
n++;
}
}
int main(void){
char line[80];
int m, n, i, j, k, max_n, max_j;
gets(line);
m = atoi(line);
max_n = -1;
for(j=1; j<=m; j++){
n = 0;
for(i=1; i<=j; i++){
k = j % i;
if(k == 0){
n++;
}
}
if(n > max_n){
max_n = n;
max_j = j;
}
}
printf("%d %d\n", max_j, max_n);
}
ループ中での一回の結果と「暫定トップ」を比較する際に,
ここでは > を用いている.
もし同じ最大値が複数あった場合には,
この比較によれば最初に出現したものが優先することになる.
比較として >= を用いれば, 最後の出現が優先される.