Pratique quotidienne du langage C - Jour 82 : L'erreur de calcul du roi Shehan

Pratique quotidienne du langage C22
février 2022

Description du sujet

Selon la légende, les échecs ont été inventés par Dayil, le premier ministre de l'ancien roi indien de Shehan. Le roi Shehan aimait beaucoup les échecs et a décidé de laisser le Premier ministre choisir le type de récompense. Le sage premier ministre a pointé du doigt l'échiquier 8×8 avec un total de 64 cases et a dit : Votre Majesté, s'il vous plaît, donnez-moi du blé. Il suffit de mettre 1 grain dans la première case de l'échiquier, 2 grains dans la deuxième case et 4 grains dans la troisième case. Après cela, chaque case est doublée par rapport à la case précédente. Après avoir placé 64 cases sur l'échiquier, je remercierai vous tellement. Le roi Shekhan a demandé un sac de blé et il a voulu tenir sa promesse. Veuillez programmer pour savoir combien de blé le roi doit donner au total à son premier ministre.

analyse du problème

Mettre 1 grain dans la première case et 2 grains dans la deuxième case, chaque fois qu'elle est deux fois plus grande que la case précédente. Il y a 64 cases dans un échiquier, on obtient donc la formule suivante :
insérez la description de l'image ici
On voit que cela doit être un très grand nombre de , si vous maîtrisez très bien les opérations binaires, vous pouvez même voir le résultat de cette formule, oui, c'est 2 64 -1 . (Pour donner un exemple simple : le nombre binaire 1111 équivaut à décimal 2 0 +2 1 +2 2 +2 3 =2 4 -1=15)

Pour représenter 2 64 -1 en langage C , vous pouvez utiliser le type long long non signé .

La liste suivante répertorie le nombre d'octets occupés par des variables de différents types sur des machines 32 bits et des machines 64 bits sous le compilateur GCC :

type de données 32 bits 64 bits
carboniser 1 1
court 2 2
entier 4 4
entier non signé 4 4
long 4 8
long non signé 4 8
longtemps longtemps 8 8
carboniser* 4 8
flotter 4 4
double 8 8

Mon compilateur est 32 bits, donc je dois utiliser unsigned long long (la plage de long long est -2 63 ~ 2 63 -1, ce qui ne peut pas représenter 2 64 -1.
Il existe des types doubles sur Internet, mais je suis dans ma compilation Le résultat correct ne peut pas être obtenu sur l'appareil.

Code

#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;
}

résultat de l'opération

insérez la description de l'image ici

référence en ligne

Pour référence uniquement (la réponse d'origine est fausse, le code peut être correct)
Lien d'origine : 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;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43772810/article/details/123071130
conseillé
Classement