完美乘法(完美乘积)--用C语言实现

完美乘法定义:

a * b = c

a,b,c三个数中只出现了0~9这10个数字,且每个数字在这个等式中只出现一遍。(注:0~9这十个数字都有出现,即a,b,c的位数加起来总共有十位)

例如:3 * 6819 = 20457为完美乘法 36 * 495 = 17820也为完美乘法

(注:3 * 6819 = 20457和6819 * 3 = 20457是同一个组合)

算法要求:输出符合条件的所有完美乘法并输出总共有多少个

算法思路:1、a从1遍历到99,b从100遍历到9999,因为a,b,c位数之和为10,a,b位数差最小为两位数乘三位数,得c为五位数,位数和为10。a,b位数差最大为一位数乘四位数,c最大也为五位数,同样位数和为10。2、对遍历的每一个等式中出现的数字统计看是否符合完美乘法。

算法:

#include <stdio.h>
int main(void)
{
	int c,i,count = 0;    //count统计符合完美乘法条件的个数
	int f[10],s[3];    //f[10]统计数字0-9出现的次数,例如f[1]=3表示数字1出现了3次,
                       //s[3]分别表示a,b,c三个数
	int key,y,t;    //key用于统计f数组中不为1的元素个数,y,t用于更新数组f中元素的值

	for(int a=1;a<99;a++)
	{
		for(int b=100;b<9999;b++)
		{
			key = 0;
			for(i=0;i<10;i++)
				f[i] = 0;   //数组清零
			c = a * b;
			s[0] = a;
			s[1] = b;
			s[2] = c;
			//更新f数组
			for(i=0;i<3;i++)
			{
				y = s[i];
				while(y>0)
				{
					t = y%10;
					f[t]++;
					y = y/10;
				}
			}
			//统计f数组中不为1的元素个数
			for(i=0;i<10;i++)
			{
				if(f[i]!=1) key++;
			}
			//若f数组每个元素都为1,即0-9各出现了一次,则符合完美乘法要求
			if(key==0)
			{
				count++;
				printf("%d * %d = %d\n",a,b,c);
			}
		}
	}
	printf("符合完美乘法的等式共有%d组\n",count);
}

输出结果如下:

3 * 5694 = 17082
3 * 6819 = 20457
3 * 6918 = 20754
3 * 8169 = 24507
3 * 9168 = 27504
4 * 3907 = 15628
4 * 7039 = 28156
4 * 9127 = 36508
6 * 5817 = 34902
7 * 3094 = 21658
7 * 4093 = 28651
7 * 9304 = 65128
7 * 9403 = 65821
27 * 594 = 16038
36 * 495 = 17820
39 * 402 = 15678
45 * 396 = 17820
46 * 715 = 32890
52 * 367 = 19084
54 * 297 = 16038
63 * 927 = 58401
78 * 345 = 26910
符合完美乘法的等式共有22组

有更好的算法可以一起讨论呀

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0小小怪0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值