1.实验题目
(2229)农夫约翰命令他的母牛寻找不同的数字集合,这些数字与给定的数字相加。奶牛只使用数字2的整数次幂。这里是可能的数字集合,总数为7:
1)1 + 1 + 1 + 1 + 1 + 1 + 1
2)1 + 1 + 1 + 1 + 1 + 2
3)1 + 1 + 1 + 2 + 2
4)1 + 1 + 1 + 4
5)1 + 2 + 2 + 2
6)1 + 2 + 4
帮助FJ计算所有可能对于一个给定的整数n表示(1≤n≤1000000)。
【输入】
只有一个整数的单行,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),(12,20),(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),(12,20),(13,20)。即1=1,2=1+1,3=2,4=2+1+1=4,5=4,6=4+2=6,7=6,8=6+4=10,9=10,10=10+4=14,11=14,12=14+6=20。即①i%2!=0,f[i] = f[i-1],②i%2==0,f[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。程序执行后显示

在第一行输入一个整数n(1≤n≤1000000),再点击回车键即第二行输出结果。
7.测试结果
1) 建立函数:
» 输入:7
输出:6
本文介绍了一种算法,用于计算一个整数能以多少种方式表示为2的幂次之和,特别关注于如何通过编程实现这一过程,并提供了具体的C++代码示例。
832

被折叠的 条评论
为什么被折叠?



