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;
}
来源:CSDN
作者:rainbow_赵璇
链接:https://blog.csdn.net/weixin_45696526/article/details/104145086