Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【C/C++】基礎力が試される!トリッキーなプログラム10選


ここでは、プログラミングの基礎力を試すことのできる、ちょっと変わった(トリッキーな)プログラムを10個紹介します。面接対策や学習の復習に、ぜひ活用してください。

1. C++で引用符「"」を出力するプログラム

C++では、出力するテキストの開始と終了を示すために引用符(ダブルクォート)を使用します。そのため、引用符そのものを出力するには、特別なエスケープシーケンスが必要です。C++で引用符を出力するには「\"」を使用します。

#include<iostream>
using namespace std;
int main() {
   cout<<"\"Tutorials Point \"";
   return 0;
}

出力結果

"Tutorials Point "

2. ループやgoto文を使わずに1から10までの数字を出力するプログラム

プログラミングにおいて、同じコードブロックを繰り返し実行する方法には、主に以下の3つがあります。

  • ループを使用する
  • goto文を使用する
  • 再帰関数を使用する

ループとgoto文が使えない場合、唯一有効な方法は再帰関数です。再帰呼び出しを使って1から10までの数字を出力する方法を見てみましょう。

#include <stdio.h>
void printNumber(int count){
   printf("%d\n", count );
   count+=1;
   if(count<=10)
      printNumber(count);
}
int main(){
   printNumber(1);
   return 0;
}

出力結果

1
2
3
4
5
6
7
8
9
10

3. 算術演算子や比較演算子を使わずに2つの数の等価性をチェックする

2つの数が等しいかどうかを確認するには、ビットごとのXOR演算子(^)を利用できます。2つの数が等しい場合、それらのXORの結果は0になります。この考え方をプログラムで実装してみましょう。

#include<iostream>
using namespace std;
int main(){
   int a = 132;
   int b = 132;
   if ( (a ^ b) )
      cout<<"a is not equal to b";
   else
      cout<<"a is equal to b";
      return 0;
}

出力結果

a is equal to b

4. セミコロンを使わずに「Hello」を出力するC/C++プログラム

C/C++には、セミコロンを使わずに何かを出力する方法があります。これは、出力関数printfの戻り値を利用するものです。printf関数は、出力画面に表示した文字数を返します。この戻り値をif文の条件式に使えば、セミコロンなしで実行できます。

#include <stdio.h>
int main(){
   if(printf("Hello "))
   return 0;
}

出力結果

Hello

5. 比較演算子を使わずに2つの数の最大値と最小値を求めるプログラム

比較演算子を使わずに2つの数の最大値と最小値を求めるには、絶対値を返すabs関数に2つの数の差を渡します。abs関数は2つの数の正の差を返すため、この絶対差を和に加減算することで、最大値と最小値を求めることができます。

#include<iostream>
using namespace std;
int main (){
   int x = 15, y = 20;
   cout<<"The numbers are x = "<<x<<"and y = "<<y<<endl;
   cout<<"The max of the numbers is "<<((x + y) + abs(x - y)) / 2<<endl;
   cout<<"The min of the numbers is "<<((x + y) - abs(x - y)) / 2<<endl;
   return 0;
}

出力結果

The numbers are x = 15and y = 20
The max of the numbers is 20
The min of the numbers is 15

6. プログラム自身のソースコードを出力する

プログラムのソースコードを、そのプログラム自身の出力として表示するのは少し難しい問題で、プログラミング言語への深い理解が必要です。

このプログラムでは、ファイル操作の概念を利用し、自分自身のコードが書かれているファイルを開いて、その内容を表示します。プリプロセッサマクロ「__FILE__」を使うことで、現在のソースファイル名を取得できます。

#include <stdio.h>
int main(void){
   FILE *program;
   char ch;
   program = fopen(__FILE__, "r");
   do{
      ch=fgetc(program);
      printf("%c", ch);
   }
   while(ch!=EOF);
      fclose(program);
   return 0;
}

7. +演算子を使わずに2つの数の和を求めるプログラム

+演算子を使わずに2つの数の和を求めるには、-演算子を工夫して使う方法があります。相手の数の負の値を引くことで、結果的に足し算と同じ効果が得られます。

#include<iostream>
using namespace std;
int main(){
   int x = 5;
   int y = 5;
   int sum = x - (-y);
   cout<<"The numbers are x = "<<x<<" y = "<<y<<endl;
   cout<<"Their sum = "<<sum;
   return 0;
}

出力結果

The numbers are x = 5 y = 5
Their sum = 10

8. 算術演算子や関係演算子を使わずに、与えられた数が偶数かどうかをチェックする

与えられた数が偶数かどうかを判定するには、ビット演算子を利用できます。ビットごとのAND演算子(&)と0x01を組み合わせると、数の0番目のビット(最下位ビット)をチェックできます。0番目のビットが1であれば奇数、そうでなければ偶数です。

#include<iostream>
using namespace std;
int main(){
   int a = 154;
   if(a & 0x01) {
      cout<<a<<" is an odd number";
   } else{
      cout<<a<<" is an even number";
   }
   printf("\n");
   return 0;
}

出力結果

154 is an even number

9. /演算子を使わずに数を4で割るプログラム

除算演算子を使わずに数を4で割るには、ビットを右にシフトする右シフト演算子「>>」を使用します。2ビット右にシフトすることで、2の2乗である4で割ったのと同じ結果が得られます。

#include<iostream>
using namespace std;
int main(){
   int n = 128;
   cout<<n<<"divided by 4 = ";
   n = n >> 2;
   cout<< n;
   return 0;
}

出力結果

128 divided by 4 = 32

10. 各桁の和が一桁になるまで再帰的に計算するC++プログラム

数のすべての桁を足し合わせて和を計算し、それが一桁であれば終了し、そうでなければ一桁になるまで計算を繰り返します。なお、この性質(デジタルルート)を利用すると、「9で割った余り」を使って一発で求めることも可能です。

#include <iostream>
using namespace std;
int main() {
   int a = 534;
   int sum;
   if(a)
      sum = a % 9 == 0 ? 9 : a % 9 ;
   else
      sum = 0;
   cout<<"The final sum is "<<sum;
   return 0;
}

出力結果

The final sum is 3

  1. C++で巨大な数値を扱う方法:Boostライブラリのmultiprecision活用

    C++では標準の整数型だけでは表現できない巨大な数値も、Boostライブラリを使えば簡単に扱うことができます。BoostはC++で最も広く利用されている定番ライブラリの一つで、さまざまな分野に対応した豊富な機能を提供しています。その中でもmultiprecisionモジュールを使えば、264をはるかに超えるような大きな数値でも問題なく演算できます。この記事では、Boostライブラリを使った多倍長整数の扱い方を、実際のコード例とともに解説します。固定精度の整数型(int128_t、int256_tなど)boost::multiprecision名前空間には、int128_t、int256_t、i

  2. C++で配列を使って数値の平均を計算する方法【初心者向け解説】

    数値の平均値とは、すべての数値を合計し、その合計を数値の個数で割ることで求められます。これは統計やプログラミングの基礎となる重要な計算の一つです。平均の計算例具体的な例を見てみましょう。以下の5つの数値の平均を求める場合を考えます。平均を求める対象の数値:10, 5, 32, 4, 9 数値の合計 = 60 数値の平均 = 60 ÷ 5 = 12配列を使用した平均計算プログラムそれでは、C++で配列を使用して数値の平均を計算するプログラムを見ていきましょう。サンプルコード#include <iostream> using namespace std; int main() {