洛谷 P1149 火柴棒等式(太suang絡吧)
阿新 • • 發佈:2018-12-16
題目描述
給你n根火柴棍,你可以拼出多少個形如“A+B=CA+B=C”的等式?等式中的AA、BB、CC是用火柴棍拼出的整數(若該數非零,則最高位不能是00)。用火柴棍拼數字0-90−9的拼法如圖所示:
注意:
加號與等號各自需要兩根火柴棍
如果A≠B,則A+B=C與B+A=C視為不同的等式(A,B,C>=0)
n根火柴棍必須全部用上
輸入輸出格式
輸入格式: 一個整數n(n<=24)。
輸出格式: 一個整數,能拼成的不同等式的數目。
輸入輸出樣例
輸入樣例#1: 複製 14 輸出樣例#1: 複製 2 輸入樣例#2: 複製 18 輸出樣例#2: 複製 9 說明
【輸入輸出樣例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
洛谷新手村的題目鴨
兩種思路:
1、給你n根火柴棒,求有多少種等式。
2、給你不同等式,求用了多少根火柴棒。
個人認為第二種更好
可以暴力列舉,也可以遞迴
迭代的方法生成了2000左右的數字所需火柴棒數,然後再列舉C和A,得到B=C-A,看看三個數字的火柴數目是否等於n就可以了。
洛谷已經AC
#include<cstdio> int main() { int a[2001]={6};//第一個初始化為6 因為數字0用火柴棒擺出來要六根 int n;//一共給了多少火柴 int b[10]={6,2,5,5,4,5,6,3,7,6};//這個代表0~9分別需要多少根火柴 把它們存在一個數組裡面 int s=0;//s是一個整數,表示能拼成的不同等式的數目。等下會輸出的 int j; scanf("%d",&n);//輸入的n代表火柴的總根數 for(int i=1;i<=2000;i++) //迭代的方法生成了2000左右的數字所需火柴棒數 { j=i;//j代表列舉的每一個數 while(j>=1)//這個while迴圈 目的是求每個數所用的火柴棒 { a[i]=a[i]+b[j%10]; j=j/10; } } for(int i=0;i<=1000;i++) //把1-1000表示出來就行 { for(j=0;j<=1000;j++) if(a[i]+a[j]+a[i+j]+4==n)//if語句 判斷 總的式子 是否正好可以把火柴棒用完 //別忘了+4 因為還有加號與等號 s++;//能拼成的不同等式的數目++ } printf("%d",s); return 0; }