C语言数字拆解问题

这是几天前蓝桥杯的一道往年竞赛题
前些天参加蓝桥杯赛前培训的时候老师用Java语言敲过
今天重新用C语言敲了一遍

这是一道数字拆解的问题
题目是让编写程序来得到一个数共有几种不同的拆解方法
例如 3 可以拆分成1+1+1;1+2;
例如 4 可以拆分成 2 + 2 ;2 + 1 + 1 ; 1 + 1 + 1 + 1
我们接下来编写一个程序来验证一个数有几种拆法!

#include<stdio.h>
#include<stdlib.h>

#define NUM 10       
#define DEBUG 0

int main(void)
{
	int table[NUM][NUM / 2 + 1]; //建立一个动态规划表格 
	int count = 0;
	int result = 0;
	int i, j, k;
	printf("数字拆解\n");
	printf("以此类推,求 %d 有几种拆法 ? ", NUM);


	for (i = 0; i < NUM; i++)  //使用循环进行初始化
	{
		table[i][0] = 1;
		table[i][1] = 1;
	}

	for (i = 2; i <= NUM; i++)  //套用循环
	{
		for (j = 2; j <= i; j++)
		{
			if (i + j > NUM)
			{
				continue;
			}
			count = 0;
			for (k = 1; k <= j; k++)
			{
				count += table[i - k][(i - k >= k) ? k : i - k];
			}
			table[i][j] = count;
		}
	}

	for (k = 1; k <= NUM; k++)  //计算并显示结果 
	{
		result += table[NUM - k][(NUM - k >= k) ? k : NUM - k];
	}
	printf("\n\nresult: %d\n", result);

	if (DEBUG)
	{
		printf("\n除错资讯\n");
		for (i = 0; i < NUM; i++)
		{
			for (j = 0; j < NUM / 2 + 1; j++)
			{
				printf("%2d", table[i][j]);
			}
			printf("\n");
		}
	}
	system("pause");
	return 0;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值