C言語の日常の練習-82日目:Shehan王の誤算

C言語の日常練習
2022年2月22日

トピックの説明

伝説によると、チェスは古代インドのシェハン王の首相であるダイルによって発明されました。シェハン王はチェスがとても好きで、首相にどのような報酬を選ばせるかを決めました。賢明な首相は、合計64個の正方形の8×8のチェス盤を指差して言った:陛下、小麦をください。チェス盤の最初の正方形に1粒、2番目の正方形に2粒、3番目の正方形に4粒を入れるだけです。その後、各正方形は前の正方形の2倍になります。ボードに64個の正方形を置いたら、感謝します。あなたはそんなに。シェカン王は小麦の袋を求めました、そして彼は彼の約束を果たしたいと思いました。王が首相に合計でどれだけの小麦を与える必要があるかを知るためにプログラムしてください。

問題分析

前の正方形の2倍の大きさになるたびに、最初の正方形に1粒、2番目の正方形に2粒を入れます。チェス盤には64個の正方形があるので、次の式が得
ここに画像の説明を挿入
られます。の数は、バイナリ操作に非常に精通している場合は、この式の結果を確認することもできます。そうです264-1です(簡単な例を挙げると、2進数の1111は10進数の2 0 +2 1 +2 2 +2 3 = 2 4 -1 = 15に相当します)

C言語で264-1を表すには、 unsignedlonglong型を使用できます

以下に、GCCコンパイラーの32ビットマシンおよび64ビットマシンでさまざまなタイプの変数が占めるバイト数を示します。

データの種類 32ビット 64ビット
char 1 1
短い 2 2
int 4 4
unsigned int 4 4
長さ 4 8
unsigned long 4 8
長い長い 8 8
char * 4 8
浮く 4 4
ダブル 8 8

私のコンパイラは32ビットなので、unsigned long longを使用する必要があります(longlongの範囲は-263〜2 63-1あり、 2 64-1を表すことはできませんインターネットにはdouble型がありますが、私は私のコンパイルでは、デバイスで正しい結果を取得できません。

コード

#include <stdio.h>

int main()
{
    
    
    unsigned long long sum = 1, tmp = 1;
    int i = 0;
    //从第二个格子开始算,总共63个格子
    for(i = 1; i < 64; i++)
    {
    
    
        tmp *= 2;
        sum += tmp;
    }
    printf("国王总共需要将%llu粒麦子赏赐给他的宰相\n", sum);
    return 0;
}

運転結果

ここに画像の説明を挿入

オンラインリファレンス

参考までに(元の答えは間違っています、コードは大丈夫かもしれません)
元のリンク:http ://c.biancheng.net/cpp/html/3321.html

#include <stdio.h>
#include <math.h>
int main()
{
    
    
    double sum = 0;  /*定义double型变量sum存放累加和*/
    int i;
    /*使用循环求累加和*/
    for( i=1; i<=64; i++ )
        sum = sum + pow(2.0, (i-1));  /*注意变量为double型*/
    printf("国王总共需要赏赐给宰相的麦子数为:\n%f\n", sum);  /*打印结果*/
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_43772810/article/details/123071130