acm实习之只使用数字2的整数次幂

本文介绍了一种算法,用于计算一个整数能以多少种方式表示为2的幂次之和,特别关注于如何通过编程实现这一过程,并提供了具体的C++代码示例。

1.实验题目

(2229)农夫约翰命令他的母牛寻找不同的数字集合,这些数字与给定的数字相加。奶牛只使用数字2的整数次幂。这里是可能的数字集合,总数为7

11 + 1 + 1 + 1 + 1 + 1 + 1

21 + 1 + 1 + 1 + 1 + 2

31 + 1 + 1 + 2 + 2

41 + 1 + 1 + 4

51 + 2 + 2 + 2

61 + 2 + 4

帮助FJ计算所有可能对于一个给定的整数n表示(1n1000000)。

【输入】

只有一个整数的单行,N

【输出】

表示n为表示和的数目的方法。由于这个数字的潜在巨大尺寸,只打印最后9位数字(在基10表示)。

输入范例7

输出范例6

2.需求分析

本演示程序用VC++6.0编写,完成一个整数由2的整数次幂相加
 输入的形式和输入值的范围:只有一个整数的单行,n。在所有输入中,元素的值都是整数
 输出的形式:表示n为表示和的数目的方法。由于这个数字的潜在巨大尺寸,只打印最后9位数字(在基10表示)。
 程序所能达到的功能:完成一个整数由2的整数次幂相加
 测试数据:
输入范例7

输出范例6

3.概要设计

1)为了实现上述程序功能,先在稿纸算出1-13的和的数目,从中找出规律

1,1),(2,2),(3,2),(4,4),(5,4)(6,6),(7,6),(8,10),(9,10),(10,14),(11,14),(1220),(13,20
2)本程序包含1个函数:
 主函数main()

4.详细设计

1为了实现上述程序功能,先在稿纸算出1-12的和的数目,从中找出规律

1,1),(2,2),(3,2),(4,4),(5,4)(6,6),(7,6),(8,10),(9,10),(10,14),(11,14),(1220),(13,20)。即1=12=1+1,3=24=2+1+1=4,5=4,6=4+2=6,7=68=6+4=10,9=1010=10+4=14,11=1412=14+6=20。即①i%2!=0f[i] = f[i-1],②i%2==0f[i]=(f[i-1] + f[i/2])%M

2)具体代码:

#include<stdio.h>

#define  M 1000000000                        //只打印最后9位数字

#define  N 1000005                          //根据输入的n的范围

int f[N] ;

int main()  

{  

    int n, i;  

     scanf("%d",&n);                       //输入一个整数

    f[0] =f[1] = 1;                        //1=1

    for(i=2; i <= n; i++)  

if(i%2!=0)  

            f[i] = f[i-1];           //i为奇数,它的满足条件的个数与它的前一个数一样

        else   

            f[i]=(f[i-1] + f[i/2])%M;      //根据1-13的结果得出结论

    printf("%lld",f[n]);                   //输出结果

    return 0;  

}

5.调试分析
#include<stdio.h>

#define  M 1000000000                        //只打印最后9位数字

#define  N 1000005                          //根据输入的n的范围

int f[N] ;

int main()  

{  

    int n, i;  

     scanf("%d",&n);                       //输入一个整数

    f[0] =f[1] = 1;                        //1=1

    for(i=2; i <= n; i++)  

if(i%2!=0)  

            f[i] = f[i-1];           //i为奇数,它的满足条件的个数与它的前一个数一样

        else   

            f[i]=(f[i-1] + f[i/2])%M;      //根据1-13的结果得出结论

    printf("%lld",f[n]);                   //输出结果

    return 0;  

}

在调试前已定义M,N以及f[N],调试时(F11),进入主函数,有两个形参,然后执行输入语句,输入n,再根据n的值,如果n为1,即输出f[1]d的值;如果n>1,从i的范围为[2,n]判断i的奇偶if(i%2!=0) f[i] = f[i-1]; else f[i]=(f[i-1] + f[i/2])%M; i递增到n求出f(n),最终输出结果。

6.使用说明

程序名为1.exe,运行环境为VC++6.0。程序执行后显示


在第一行输入一个整数n1≤n≤1000000),再点击回车键即第二行输出结果。

7.测试结果

1建立函数
» 输入:7

输出:6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值