原题链接:[NOIP2008T2]火柴棒等式
解题思路:
注意事项:
参考代码:
看到大家都这么渣我好悲伤
洗脑开始
1.这题难道不高,关键在于思路,其实+,=个占4个火柴棒,
而他们是必须存在的,所以对火柴棒数-4就简单了,
在枚举上,我们可以枚举2个数,第三个数就是a+b啦!
根据只有20根火柴棒(删掉了=和+),
我们能知道枚举数不会超过1111,有些童鞋只枚举到了1000,难道是我错了???
注意全部火柴必须用上,该数非零,则最高位不能是0!!!!!!!
#include <iostream>
using namespace std;
int fun(int x) //用来计算一个数所需要的火柴棍总数
{
int num=0; //用来计数变量
int f[10]={6,2,5,5,4,5,6,3,7,6}; //用一个数组记录0~9数字所需的火柴棍数
while(x/10!=0) // x除以10不等于0的话,说明该数至少有两位
{
num+=f[x%10]; //加上该位火柴棍数
x=x/10;
}
num+=f[x]; //加上最高位的火柴棍数
return num;
}
int main()
{
int a,b,c,m,sum=0;
cin>>m; //火柴棍总个数
for(a=0;a<=1111;a++) //开始枚举
{
for(b=0;b<=1111;b++)
{
c=a+b;
if(fun(a)+fun(b)+fun(c)==m-4) //去掉+和=
sum++;
}
}
cout<<sum<<endl;
return 0;
}
2.较简短代码。
#include<iostream>
using namespace std;
int nu[10]={6,2,5,5,4,5,6,3,7,6};//定义个辅助数组记录每个数字所需的火柴数int matches(int num){ //一个用来计算一个数需多少个火柴棒的函数
int i,k=0; //K是火柴棒的数量
for(i=num;i!=0;i/=10)k+=nu[i%10]; //将这个数字每一位的火柴棒的数量都计算出来
if(num==0)k+=nu[0]; //有一种特殊情况:数字为0此时不会执行上述程序,所以加一个
return k;
}int main(){ int i,j,all=0,n; //all是符合条件的算式总数
cin>>n;
for(i=0;i<=1000;i++)for(j=0;j<=1000;j++)if(matches(i)+matches(j)+matches(i+j)+4==n)all++; //如果这个算式加起来的火柴棒总数刚好用完所有火柴棒就把数量往上加
cout<<all;
return 0;
}
3.这道题的n<=24.所以,最大1111+1111?1111;
显然不等,但1111+1111不等,
说明两个循环i,j均<=1111;所以直接O(n^2);再用一个函数判等;一个数组储存0到9的火柴棒数;。。。
#include<bits/stdc++.h>
using namespace std;
int num[10]={6,2,5,5,4,5,6,3,7,6},n,t,sum,i,j; bool check[1115]; int cnt(int x)
{
sum=0; if(x==0) return 6; else
{ while(x!=0)
{
sum+=num[x%10];
x=x/10;
} return sum;
}
} int main()
{ while(true)//反抄袭;
scanf("%d",&n); for(i=0;i<=1111;++i) for(j=0;j<=1111;++j)
{ if(cnt(i)+cnt(j)+cnt(i+j)==n-4)
{
t++;
}
} cout<<t;
return 0;
}
为了看看大家到底对这题懂了多少,我给大家一个思路让大家来编
写完后用踢界的方式上传给我看看,ok!!
打表,制作一张0~1000数需要的火柴棒的表,然后再穷举求解。
a[]数组记录0..9所需要的火柴数,用于制作b[]这张大表。
其中,book的作用是使计算b[0]时不会使它的值计算为0(开始犯的错误...)
最后,二重循环穷举a,b,c,用if 语句判断。
最后输出ans.0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include <stdio.h> #include<stdlib.h> int fan(int a) { int number[10] = { 6,2,5,5,4,5,6,3,7,6 }; int result = 0; if (a == 0) return 6; else { while (a > 0) { result = result+number[a % 10]; a = a / 10; } return result; } } int main() { int a,b,result=0,x; scanf("%d", &a); a = a - 4; b = a; int i=0, j=0,z; while (i<1000) { j = 0; if (fan(i)< a) while (i + j < 1000) { b = a - fan(i) - fan(j); z = i + j; if (b == fan(z)) result++; j++; } i++; } printf("%d", result); return 0; }