首页 > 其他分享 >再分麦粒(C语言)

再分麦粒(C语言)

时间:2024-05-27 21:03:17浏览次数:8  
标签:count 麦粒 int long result1 result C语言

题目描述

在国际象棋棋盘上 (共 64 格) 放麦粒,第一格一粒,…… 后面一格总是前面一格的两倍,摆满整个棋盘后,可放置的麦粒数达到了 18446744073709551615, 如果再继续增加格子,比如格子数到达 3021377 时,放置的麦粒数将达到 909526 位。现要求给定的格子数 n (小于 3100000), 计算放置麦粒数目的最后 500 位数字.

输入描述

一个正整数 n

输出描述

麦粒总数的最后 500 位 (不足 500 位时最高位补 0)

样例输入

11213

样例输出

37229319592369288171375276702260450911735069504025016667755214932073643654199488477010363909372005757899989580775775126621113057905717449417222016070530243916116705990451304256206318289297738303095152430549772239514964821601838628861446301936017710546777503109263030994747397618576207373447725441427135362428360863669327157635983045447971816718801639869547525146305655571843717916875669140320724978568586718527586602439602335283513944980064327030278104224144971883680541689784796267391476087696392191

代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 500

long long num;
int result[N] = {0};
int result1[N] = {0};

void Product()
{
    long long i = 0, s = 0, count = 0, j;

    //这样设计是为了保证第一格的数值不被漏下,也就是2^0 = 1;
    result[499] = 1;
    result1[499] = 1;

    for(i = 0; i < num - 1; i ++)
    {
        //result数组的任务是计算对应的格子中的数量。
        count = 0;

        for(j = N - 1; j >= 0; j --)
        {
            s = result[j] * 2;
            result[j] = (count + s) % 10;
            count = s / 10;
        }

        //result1数组的任务是计算所有格子中的麦粒数量。
        count = 0;

        for(j = N - 1; j >= 0; j --)
        {
            s = result[j] + result1[j];
            result1[j] = (count + s) % 10;
            count = s / 10;
        }

    }
}

void Print()
{
    int i = 0;

        for(i = 0; i < N; i ++)
            printf("%d", result1[i]);

        printf("\n");
}
int main()
{
    while(scanf("%lld", &num) != EOF)
    {
        Product( );
        Print( );

        for(int i = 0; i < N; i ++)
        {
            result[i] = 0;
            result1[i] = 0;
        }
    }
    return 0;
}

分析

  • 首先要意识到,这其实就是等比数列求和问题,只不过数据量太大,需要用数组;
  • 在乘的过程中,可以借用高精度乘法的思想;
  • 设置两个数组,一个是某一格子中的麦粒数量,另一个是前n个格子的麦粒和;
  • 循环输入,记得初始化。

注意

每一次使用count前记得斟酌是否需要重新给count重新赋值为0或某个数。

附加(此代码c11可通过而c++14不可ac)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 500

long long num = 0;
int result[N] = {0};
int result1[N] = {0};

void Product()
{
    long long i = 0;

    //这样设计是为了保证第一格的数值不被漏下,也就是2^0 = 1;
    result[499] = 1;
    result1[499] = 1;

    for(i = 0; i < num - 1; i ++)
    {
        number1();
        number2();
    }
}

void number1()
{
    int count = 0, s = 0, j;

    //result数组的任务是计算对应的格子中的数量。
    for(j = N - 1; j >= 0; j --)
    {
        s = result[j] * 2;
        result[j] = (count + s) % 10;
        count = s / 10;
    }
}

void number2()
{
    int count = 0, s = 0, j;

    //result1数组的任务是计算所有格子中的麦粒数量。
    for(j = N - 1; j >= 0; j --)
    {
        s = result[j] + result1[j];
        result1[j] = (count + s) % 10;
        count = s / 10;
    }
}

void Print()
{
    int i = 0;

    for(i = 0; i < N; i ++)
        printf("%d", result1[i]);

    printf("\n");
}

int main()
{
    while(scanf("%lld", &num) != EOF)
    {
        Product();
        Print();

        for(int i = 0; i < N; i ++)
        {
            result[i] = 0;
            result1[i] = 0;
        }
    }
    return 0;
}

如果有哪位大神知道问题出在哪里,请教教我,感谢!!!

欢迎大家留言,谢谢观看。

标签:count,麦粒,int,long,result1,result,C语言
From: https://blog.csdn.net/2301_79824677/article/details/139247387

相关文章

  • C语言——学生信息管理系统——船长版
    C语言——学生信息管理系统概要完成第一个小项目,学生信息管理系统整体架构流程实现增,删,改,查,四个操作代码实现必要准备:typedefstructStudent{charname[20];intage;intclass;floatheight;}Student;#defineMAX_ARR10000intstu_cnt=......
  • C语言
    零碎知识点函数定义不可以嵌套函数调用可以嵌套数组不能相互赋值以返回值和形参为标准运算符优先级编译流程主要分为4个步骤:①预处理(预编译):宏定义展开,头文件展开,条件编译,这里并不会检查语法在编译代码基本语法之前,进 行头文件的引入和宏定义替换 ----gc......
  • 初识C语言——扫雷游戏(内附完整代码+详细解释)
    文章目录一、游戏各功能模块实现1.雷区的定义2.雷区初始化3.显示雷区4.布置雷区5.获取某坐标周围8个位置地雷的个数6.扫雷7.递归展开二、运行结果1.扫雷成功2.扫雷失败三、完整代码1.game.h2.game.c3.test.c总结一、游戏各功能模块实现1.雷区的定义//雷区的行列......
  • 链表4(法二)------7-4 sdut-C语言实验-单链表中重复元素的删除
    7-4sdut-C语言实验-单链表中重复元素的删除分数20全屏浏览切换布局作者 马新娟单位 山东理工大学按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。输入格式:第一行输入元素个数n(1<=n<=15);第二......
  • 链表6(法二好理解)------ 7-6 sdut-C语言实验-有序链表的归并分数 20
    7-6sdut-C语言实验-有序链表的归并分数20全屏浏览切换布局作者 马新娟单位 山东理工大学分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。输入格式:第一行输入M与......
  • 深度剖析整型和浮点型数据在内存中的存储(C语言)
    目录整型在内存中的存储为什么整型在内存中存储的是补码?大小端字节序为什么有大端小端?浮点型家族浮点数在内存中的存储longlong整型在内存中的存储    整型在内存中有三种二进制表示形式:原码,反码,补码。对于正数而言,三种形式均有符号位和数值位两部分(最高......
  • 【C语言】自定义类型:联合与枚举的简明概述
    ......
  • C语言学习——程序中的循环结构
    目录一、while循环二、do...while循环三、for循环四、三种循环的比较不同一、while循环while循环语句基本结构如下 :while(条件)//条件为逻辑值,判断真假{循环语句;}while语句的语义是:计算表达式的值,当值为真(非零)时,执行循环语句。 1.循环条件必须被改变,否则......
  • C语言基础
    相关知识点:由冯.诺依曼提出的“存储程序”:      1.采用“存储程序”的工作方式。   2.计算机系统组成:运算器、存储器、控制器、输入设备、输出设备。   3.指令和数据同等地位存储在存储器中。   4.指令和数据均用二进制代码表示;指令由操作码和地址码......
  • C语言指针应用编程
    实验11.1点击查看代码#include<stdio.h>#defineN5voidinput(intx[],intn);voidoutput(intx[],intn);voidfind_min_max(intx[],intn,int*pmin,int*pmax);intmain(){inta[N];intmin,max;printf("录入%d个数据:\n",N);......