P1618 三连击(升级版)

不打扰是莪最后的温柔 提交于 2020-02-03 02:22:28

P1618 三连击(升级版)

需要将itoa的源码添加才能被识别

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/* itoa是广泛使用的非标准C语言和C++语言扩展功能。但因为它是一个非标准的C / C++语言功能,因此不能好好的被所有编译器使用 */
/*//itoa的源码
char* itoa(int num,char* str,int radix){
//索引表
	char index[] = "0123456789ABCDEF";
	unsigned unum;
//中间变量
	int i = 0, j, k;
	//确定unum的值
	if (radix == 10 && num < 0) { //十进制负数
		unum = (unsigned)-num;
		str[i++] = '-';
	}
	else 
		unum = (unsigned)num; // 其他情况
//转换
	do {
		str[i++] = index[unum % (unsigned)radix];
		unum /= radix;
	} while (unum);
	str[i] = '\0';
//逆序
	if (str[0] == '-')
		k = 1; // 十进制负数
	else
		k = 0;
	for (j = k;j <= (i - 1) / 2;j++){
		char temp;
		temp = str[j];
		str[j] = str[i - 1 + k - j];
		str[i - 1 + k - j] = temp;
	}
	return str;
 */
int a[9] = { 0 };//标记0-9,数组里面的数为1时这个数被已经用过,0则没有用过
int ok = 0;
void dfs(char s[7], int d,int b,int c) {
	char str[7] = "\0", clo[7]="\0";//str的作用是获得新的字符,clo是用来复制字符串s
	strcpy(clo, s);
	int i, k = strlen(s);
	if (k != 3) //判断字符的长度没有达到三
		for (i = 0;i < 9;i++) //将九个字符都判断一遍
			if (a[i] != 1) {//判断当前字符是否被使用
				a[i] = 1;
				itoa(i + 1, str, 10);//将当前数字交给str
				strcat(clo, str);
				dfs(clo, d, b, c);//递归
				a[i] = 0;//回归
				strcpy(clo, s);
			}
	else {
		double number = ((double)atoi(s))/d;
		if (number - (int)number > 1e-18)//判断是否是小数
			return;
		int two = atoi(s) * b;
		int three = atoi(s) * c;
		char char_two[5], char_three[5];
		itoa(two, char_two, 10), itoa(three, char_three, 10);
		if (strlen(char_two) != 3 || strlen(char_three) != 3)//判断有没有超过四位数,也可以不用字符来判断直接÷1000判断是否大于0也行
			return;
			/*这段的作用是将判断另外俩个的字符有没有重复*/
		if (a[(two / 100) - 1] != 1&&(two/100)!=0) {//逐个判断该数字有没有用过且不为零
			a[(two / 100) - 1] = 1;
			if (a[((two / 10) % 10) - 1] != 1 && ((two/10)%10)!=0) {
				a[((two / 10) % 10) - 1] = 1;
				if (a[(two % 10) - 1] != 1&& (two % 10)!=0) {
					a[(two % 10) - 1] = 1;
					if (a[(three / 100) - 1] != 1&& (three / 100) != 0) {
						a[(three / 100) - 1] = 1;
						if (a[((three / 10) % 10) - 1] != 1&& ((three / 10) % 10) != 0) {
							a[((three / 10) % 10) - 1] = 1;
							if (a[(three % 10) - 1] != 1&& (three % 10) != 0){
								printf("%s %s %s\n", s, char_two, char_three);
								ok = 1;  
							}
							a[((three / 10) % 10) - 1] = 0;
						}
						a[(three / 100) - 1] = 0;
					}
					a[(two % 10) - 1] = 0;
				}    
				a[((two / 10) % 10) - 1] = 0;
			}
			a[(two / 100) - 1] = 0;
		}
	}
}
int main() {     
	int b, c, d;
	char s[7]="\0";
	scanf("%d%d%d",&d, &b, &c);
	dfs(s,d,b,c);
	if (ok == 0)
		printf("No!!!");
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!