# 蓝桥杯之暴力破解、枚举

“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字，每个都恰好出现1次。”

#include<stdio.h>
#include<math.h>

int main(){
for(int i=10;i<=30;i++){
printf("%d= %.0f %.0f\n",i,pow(i,3),pow(i,4));
}
}

------------------------------------------------

I --> 1
V --> 5
X --> 10
L --> 50
C --> 100
D --> 500
M --> 1000

49 = XLIX

I = 1
II = 2
III = 3
IV = 4
V = 5
VI = 6
VII = 7
VIII = 8
IX = 9
X = 10
XI = 11
XII = 12
XIII = 13
XIV = 14
XV = 15
XVI = 16
XVII = 17
XVIII = 18
XIX = 19
XX = 20
XXI = 21
XXII = 22
XXIX = 29
XXX = 30
XXXIV = 34
XXXV = 35
XXXIX = 39
XL = 40
L = 50
LI = 51
LV = 55
LX = 60
LXV = 65
LXXX = 80
XC = 90
XCIII = 93
XCV = 95
XCVIII = 98
XCIX = 99
C = 100
CC = 200
CCC = 300
CD = 400
D = 500
DC = 600
DCC = 700
DCCC = 800
CM = 900
CMXCIX = 999

3
LXXX
XCIII
DCCII

80
93
702

C语言定义字符串：char s[]；
C语言求字串：strstr(str1,str2);返回str1中首次出现str2的位置。

#include<stdio.h>
#include<string.h>

int main(){
int n;
scanf("%d",&n);
while(n--){
char str[6];
scanf("%s",str);
}
}

int sum;
for(int i=0;i<strlen(s);i++){
char c = s[i];
if(c=='I') sum+=1;
if(c=='V') sum+=5;
if(c=='X') sum+=10;
if(c=='L') sum+=50;
if(c=='C') sum+=100;
if(c=='D') sum+=500;
if(c=='M') sum+=1000;
}
if(strstr(s,"IV")!=NULL) sum-=2;
if(strstr(s,"IX")!=NULL) sum-=2;
if(strstr(s,"XL")!=NULL) sum-=20;
if(strstr(s,"XC")!=NULL) sum-=20;
if(strstr(s,"CD")!=NULL) sum-=200;
if(strstr(s,"CM")!=NULL) sum-=200;
return sum;
}

------------------------------------------------

“二四为肩，六八为足，左三右七，戴九履一，五居其中”，

4 9 2
3 5 7
8 1 6

0 7 2
0 5 0
0 3 0

6 7 2
1 5 9
8 3 4

#include<stdio.h>

int isTrue(int b[]);
int main(){
int a[9];
for(int i=0;i<9;i++){
scanf("%d",&a[i]);
}
isTrue(a);
return 0;
}

int isTrue(int b[]){
int a[8][9]={
{4,9,2,3,5,7,8,1,6},
{8,3,4,1,5,9,6,7,2},
{6,1,8,7,5,3,2,9,4},
{2,9,4,7,5,3,1,8,6},
{8,1,6,3,5,7,4,9,2},
{6,7,2,1,5,9,8,3,4},
{2,9,4,7,5,3,6,1,8},
{1,8,6,7,5,3,2,9,4}
};

printf("\n");

for(int i=0;i<8;i++){
int flag=1;
for(int j=0;j<9;j++){
if(b[j]==0) continue;
if(a[i][j]!=b[j]) flag=0;
}
if(flag==1){
printf("%d %d %d\n%d %d %d\n%d %d %d\n",a[i][0],a[i][1],a[i][2],a[i][3],a[i][4],a[i][5],a[i][6],a[i][7],a[i][8],a[i][9]);
break;
}
}

}

------------------------------------------------

x轴正向：绿
x轴反向：蓝
y轴正向：红
y轴反向：橙
z轴正向：白
z轴反向：黄

x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转

xyz 则表示顺序执行x,y,z 3个操作

x

zyx

------------------------------------------------

【信用卡号的验证】

1、从卡号最后一位数字开始，逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始，逆向将偶数位数字，先乘以2（如果乘积为两位数，则将其减去9），再求和。
3、将奇数位总和加上偶数位总和，结果应该可以被10整除。

【参考测试用例】
356406010024817     成功
358973017867744     成功
356827027232781     失败
306406010024817     失败
358973017867754     失败

#include<stdio.h>

void isTrue(long long n);
int main(){
long long n;
scanf("%lld",&n);
isTrue(n);
return 0;
}
void isTrue(long long n){
int flag=1,sum=0;
while(n){
if(flag){
sum+=n%10;
n=n/10;
flag=0;

}else{
int t=(n%10)*2;
if(t>9) t=t-9;
sum+=t;
n=n/10;
flag=1;
}
}

if(sum%10==0){
printf("成功");
}else{
printf("失败");
}
}