洛谷-火柴棒等式-NOIP2008提高组复赛
题目描述 Description
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:
注意:
1. 加号与等号各自需要两根火柴棍
2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
3. n根火柴棍必须全部用上
注意:
1. 加号与等号各自需要两根火柴棍
2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
3. n根火柴棍必须全部用上
输入输出格式 Input/output
输入格式:
输入文件matches.in共一行,又一个整数n(n<=24)。
输出格式:
输出文件matches.out共一行,表示能拼成的不同等式的数目。
输入文件matches.in共一行,又一个整数n(n<=24)。
输出格式:
输出文件matches.out共一行,表示能拼成的不同等式的数目。
输入输出样例 Sample input/output
样例测试点#1
输入样例:
样例输入1:
14
样例输入2:
18
输出样例:
样例输出1:
2
样例输出2:
9
说明 description
【输入输出样例1解释】
2个等式为0+1=1和1+0=1。
【输入输出样例2解释】
9个等式为:
0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11
2个等式为0+1=1和1+0=1。
【输入输出样例2解释】
9个等式为:
0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11
思路:可以先把每个数字需要的火柴棒数目打表(存入数组),再从10开始往后找第一个加数(10一下的直接输出0,没有答案),再用两个for循环,寻找第一第二个加数(设置两个判断条件判断是否第一个加数、两个加数的和小于和),成立则ans++,本体纯属模拟。。。
代码如下:
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,k,n,x,ans=0; 5 int a[2001]={0};//对于数组a清零 6 /*=========================================*///打表,记录每个数字要用的火柴棒 7 a[0]=6;a[1]=2;a[2]=5;a[3]=5;a[4]=4; 8 a[5]=5;a[6]=6;a[7]=3;a[8]=7;a[9]=6; 9 /*=========================================*/ 10 //freopen("matches.in","r",stdin); 11 //freopen("matches.out","w",stdout); 12 scanf("%d",&n); 13 for(i=10;i<1000;i++)//从10开始找,10以下都是没有答案的,通过一位数初始化两位、三位的数所需的火柴棒(注意:最多只能到三位!) 14 { 15 x=i; 16 while(x>0) 17 { 18 a[i]+=a[x%10]; 19 x/=10; 20 } 21 } 22 n-=4;//加法和等号要用去4根火柴棒 23 /*--------------------------------------------------------------*///两重for循环开始找起! 24 for(i=0;i<=1000;i++)//循环到爆 25 { 26 if(a[i]<n)//只有当加数小于和时,才有可能加上去 27 { 28 for(j=0;j<=1000;j++)//循环到爆 29 if(a[i]+a[j]<n)//两个加数比和要小,执行 30 { 31 k=i+j;//加上和 32 /*========================*///模拟加法过程 33 if(a[i]+a[j]+a[k]==n) 34 { 35 ans++;//找到一种方案,ans++ 36 } 37 /*========================*/ 38 } 39 } 40 } 41 /*--------------------------------------------------------------*/ 42 printf("%d\n",ans); 43 return 0; 44 }
我不怕千万人阻挡,只怕自己投降…