程序设计:分析,构思,调试

程序设计:分析,构思,调试

/*神奇算式 由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成(即只包含)。
分析:位数有1位乘3位,2位乘2位,3位乘1位(与1位乘3位结果一样可以舍弃,剩下的就是1位乘3位和2位乘2位);
其中1位乘3位得到4位数的从1000/2=500开始到9999/2~=5000,1000/9=111到9999/9=1111,
其中2位乘2位得到4位数的从1000/10=100开始到9999/10~=999,1000/99~=10到9999/99=101,
从上分析取1位最小的2和3位最大的999,判断循环结束的数各取最小的,以确保覆盖范围,因此,可以设2个变量来表示,采用自增和自减在循环中完成乘积;*/
int 自增数(2), 自减数(999);/*用循环生成各位数乘积,用条件生成各位数,用条件退出循环,循环体内去做数字分析;先写一个数字分析的函数原型*/
do
{
	if (自增数 * 自减数<=9999 && 自增数 * 自减数>=1000)/*过滤不是4位数的检查*/
		数字包含分析(自增数, 自减数, 自增数 * 自减数);
	//std::cout << 自增数 << " " << 自减数 << std::endl;/*测试循环是否按设计意图正确完成*/
	if (自减数-- == (自增数<10 ? 111 : 10))
		自减数 = ++自增数<10 ? 999 : 99;
} while (自增数<100);/*当自增数小于3位时不断循环*/
/*写到这里开始测试循环是否按设计意图正确完成
之上完成调试后,接下来写数字包含分析函数了,直接在函数原型下写花括号中写处理代码*/

void 拆分位数处理(int 数组[], int 数, int 序)
{
	do
	{
		数组[序--] = 数 % 10;
	} while (数/=10);
};
void 数字包含分析(int 乘数, int 被乘数, int 乘积)
{
	/*由于要分析单独的数字,需要用一个数组存储各位数字,以便对比是否包含,而不分其位置,因此,设一个4位长度数组存储;*/
	int 数组存储[4];
	/*还需要一个拆分位数处理,因此,写一个函数;*/
	if (乘数 < 10)
	{
		拆分位数处理(数组存储, 被乘数, 3);
		数组存储[0] = 乘数;
	}
	else
	{
		拆分位数处理(数组存储, 被乘数, 3);
		拆分位数处理(数组存储, 乘数, 1);
	}
	/*数组处理调试正确后,写数字比较处理代码,需要一个代数做运算;*/
	int 一个代数(乘积); bool 是否(true);
	do
	{
		if (数组存储[0] == 一个代数 % 10)数组存储[0] = -1;/*找到后标记掉,保持唯一*/
		else if (数组存储[1] == 一个代数 % 10)数组存储[1] = -1;
		else if (数组存储[2] == 一个代数 % 10)数组存储[2] = -1;
		else if (数组存储[3] == 一个代数 % 10)数组存储[3] = -1;
		else { 是否 = false; break; }/*如果都没结束*/
	} while (一个代数 /= 10);
	/*最后显示正确的结果数字,需要一个在循环中的逻辑标记。*/
	if (是否)std::cout << 乘数 << " " << 被乘数 << " " << 乘积 << std::endl;
};
/*回头审视题目检查,发现漏了[由4个不同的数字]就是乘积中不得有重复,需要计算重复;*/
void 数字包含分析(int 乘数, int 被乘数, int 乘积)
{
	/*由于要分析单独的数字,需要用一个数组存储各位数字,以便对比是否包含,而不分其位置,因此,设一个4位长度数组存储;*/
	int 数组存储[4];
	/*还需要一个拆分位数处理,因此,写一个函数;*/
	if (乘数 < 10)
	{
		拆分位数处理(数组存储, 被乘数, 3);
		数组存储[0] = 乘数;
	}
	else
	{
		拆分位数处理(数组存储, 被乘数, 3);
		拆分位数处理(数组存储, 乘数, 1);
	}
	/*数组处理调试正确后,写数字比较处理代码,需要一个代数做运算;*/
	int 一个代数(乘积), 计算重复(0), 查找数(0); bool 是否(true);
	do
	{
		查找数 = 一个代数 % 10;
		if (数组存储[0] == 查找数)++计算重复;
		if (数组存储[1] == 查找数)++计算重复;
		if (数组存储[2] == 查找数)++计算重复;
		if (数组存储[3] == 查找数)++计算重复;
		if (计算重复 > 1){ 是否 = false; break; }
		else 计算重复 = 0;
		if (数组存储[0] == 查找数)数组存储[0] = -1;/*找到后标记掉,保持唯一*/
		else if (数组存储[1] == 查找数)数组存储[1] = -1;
		else if (数组存储[2] == 查找数)数组存储[2] = -1;
		else if (数组存储[3] == 查找数)数组存储[3] = -1;
		else { 是否 = false; break; }/*如果都没结束*/
		
	} while (一个代数 /= 10);
	/*最后显示正确的结果数字,需要一个在循环中的逻辑标记。*/
	if (是否)std::cout << 乘数 << " 乘以 " << 被乘数 << " 等于 " << 乘积 << std::endl;
	/*略优化代码深优化和调试就不累赘了。*/
};

从以上运行结果图片可作分析去进一步优化代码.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值