暴力求解法7.1.1除法(刘汝佳蓝书)

思路:
sum1代表被除数
sum2代表除数
flag1代表是否重复,flag2代表是否有结果
dig[]存各位数
已知n
n*sum2=sum1,
所以枚举sum2即可,枚举完sum2加个预判断(sum2各位是不是相同,减少后续计算量)
计算出sum1,提取出sum1各数字
判断sum1和sum2各位是否相同(这里巧妙在可以用数组,然后两个for循环即可)
不同,flag1=1,flag2=1可以输出结果
相同,flag1=0,flag2=0,输出0

一开始想的用fghji去表示,但是这样的话后面去判断每一位数字是否相同遍历起来很麻烦,换一种思路,如果用数组就很简单了

1234*1
一直到
1234*10
一直有重复数字
可以认为最小的除数>10000,这样可以减少运算量
for (int i = 0; i < 10; i++){
	for (int j = i+1; j <10; j++){
		
	}
}

代码如下

#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int dig[10];//存放每一位数, 
bool flag1, flag2;//flag1判断是否相同 =0为重复,=1为不重复 flag2判断是否有结果 

int main()
{
	int n, sum1, sum2;//n代表输入的数,sum代表后一个数 
	scanf("%d", &n);
	for (dig[0] = 0; dig[0] < 10; dig[0]++)
		for (dig[1] = 0; dig[1] < 10; dig[1]++)
			for (dig[2] = 0; dig[2] < 10; dig[2]++)
				for (dig[3] = 0; dig[3] < 10; dig[3]++)
					for (dig[4] = 0; dig[4] < 10; dig[4]++){
						if(dig[0]!=dig[1] && dig[0]!=dig[2] 
						&& dig[0]!=dig[3] && dig[0]!=dig[4] && dig[1]!=dig[2] 
						&& dig[1]!=dig[3] && dig[1]!=dig[4] && dig[2]!=dig[3] 
						&& dig[2]!=dig[4] && dig[3]!=dig[4] ) {
							sum1 = dig[0] * 10000 + dig[1] * 1000 + dig[2] * 100 + dig[3] * 10 +dig[4];
					    	sum2 = sum1 * n;
						if(9999 < sum2 && sum2 < 100000){
							dig[5]=sum2/10000;
							dig[6]=(sum2%10000)/1000;
							dig[7]=(sum2%1000)/100;
							dig[8]=(sum2%100)/10;
							dig[9]=sum2%10;
							flag1 = 1;
							for (int h = 0; h < 10; h++)
								for (int m = h + 1; m < 10; m++)
									if (dig[h] == dig[m]) {
										flag1 = 0;
									}
									if (flag1){
										flag2 = 1;//无重复代表有结果
										printf("%d / ", sum2);
										for (int w =0; w < 5; w++){
											printf("%d", dig[w]);
										}
										printf("=%d", n);
										printf("\n"); 	
									} 
						}
						
					}
				}
 if(!flag2) printf("0");
 return 0;
}

发布了77 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xingfushiniziji/article/details/100986362
今日推荐