问题描述
设
x
,
y
,
z
x,y,z
x,y,z 为非负整数,试计算集合
M
=
{
2
x
,
3
y
,
5
z
∣
x
≥
0
,
y
≥
0
,
z
≥
0
}
M=\{ 2^x,3^y,5^z | x \ge 0,y \ge 0,z \ge 0 \}
M={2x,3y,5z∣x≥0,y≥0,z≥0}
的元素由从小到大排列的多幂序列第n项与前n项之和。
算法思想描述
为了实现从小到大排序,设置三个递推变量 $a ,b ,c $ 初始值分别为 a = 2 , b = 3 , c = 5 a = 2,b=3,c=5 a=2,b=3,c=5 。设置循环条件(num < n),在循环中通过比较进行赋值:
- 如果
a < b && a < c
, 把a
的值赋给临时变量t
,然后a = a * 2
, 准备下一轮比较。 - 如果
b < a && b < c
, 把b
的值赋给临时变量t
, 然后b = b * 3
, 准备下一轮比较。 - 否则 把
c
的值赋给临时变量t
,然后c = c * 5
, 准备下一轮比较。
每次循环将零食变量 t
赋给 sum
进行求和。
程序源代码
#include<stdio.h>
void main(){
long a = 2,b = 3,c = 5; // 递推变量 分别代表 2^x,3^y,5^z
long t; // 递推过程中存放产生的数字
long sum = 0; // 计算前n项和
int n; // 递推n项
int num = 1; // 当前已经产生了n项
printf("请输入n:");
scanf("%d",&n); // 输入n
while(num <= n){
if(b > a && c > a) {
t = a;
a = a * 2;
} else if(a > c && c > b) {
t = b;
b = b * 3;
} else {
t = c;
c = c *3;
}
sum += t;
printf("%d\t",t);
if(num % 10 == 0)
printf("\n");
num++;
}
printf("\n1 - %d 项的和是:%d",n,sum);
}