lalalala


私信TA

用户名:zhangshuo

访问量:161499

签 名:

像狗一样的学习,像绅士一样地玩耍。

等  级
排  名 7
经  验 31295
参赛次数 10
文章发表 201
年  龄 12
在职情况 学生
学  校 芜湖市第十一中学
专  业

  自我简介:

今日懒惰流下的口水,将会成为明日里伤心的泪水。

解题思路:





注意事项:





参考代码:


看到大家都这么渣我好悲伤

洗脑开始

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 人评分

  评论区

#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;
}
2020-01-12 14:40:44
  • «
  • 1
  • »