欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

华为机考,华为笔试,20200715

程序员文章站 2022-07-13 14:20:36
...
/* 华为机考7.15第一题:(约用时5分钟完成)
输入两个数,n,m(范围很大,应该超过了整形范围,建议用字符串)
两个数各个位之和,相除求余数;
例如:输入 123 24
1+2+3=6,2+4=6;
6%6=0;
因此输出为:0 */
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string n, m;
    cin >> n >> m;
    int len1 = n.size();
    int len2 = m.size();
    int sum1 = 0, sum2 = 0;
    for (int i = 0; i < len1;i++)
        sum1 = sum1 + (n[i] - '0');
    for (int i = 0; i < len2;i++)
        sum2 = sum2 + (m[i] - '0');
    int res = sum1 % sum2;
    cout << res;
    return 0;
}
/* 华为机考7.15第二题(约用时20分钟完成)
食堂有5种价格的食品,价格分别为1,3,7,11,13元;
每种食品有i1,i2,i3,i4,i5件,假设有x元,问最少可以买几件食品;
输入:第一行,每种食品数量
第二行:有多少钱;
输出:最少件数
例如:   输入:1 2 3 4 5
              30
        输出:4 */
//分析:穷举,简单容易想到,好写,但是直接穷举会超时,在找到第一个总价钱和为x的数时直接结束掉就不超时了。
//因为循环时小价格外层循环,大价格内层循环,因此找到的第一个解是有较多价格高的食品,较少价格低的食品,数量应该是最少的。
#include<iostream>

using namespace std;
int main()
{
    int a0[5];
    int x0;
    for (int i = 0; i < 5;i++)
    {
        cin >> a0[i];
    }
    cin >> x0;
    int min0 = 10000;
    int sum0 = 0;
    for (int i1 = 0; i1 <= a0[0];i1++)
    {
        for (int i2 = 0; i2 <= a0[1];i2++)
        {
            for (int i3 = 0; i3 <= a0[2];i3++)
            {
                for (int i4 = 0; i4 <= a0[3];i4++)
                {
                    for (int i5 = 0; i5 <= a0[4];i5++)
                    {
                        sum0 = i1 + 3 * i2 + 7 * i3 + 11 * i4 + 13 * i5;
                        if(sum0==x0)
                        {
                            int num0 = i1 + i2 + i3 + i4 + i5;
                            if(num0<min0)
                                min0 = num0;
                            cout << min0;
                            return 0;
                        }                        
                    }
                }
            }
        }
    }
}
/*  华为机考7.15第三题(用时一个半小时未通过)
 有一些1m的绳子和一些2m的绳子,想要凑成4m的绳子,则有
 1+1+1+1,1+1+2,2+2三种方法。
 输入:一行数据,第一个为要凑成的长度m,后面a1,a2......an为已有的一些绳子(n未知)
 输出:多少种凑成m米绳子的方式
 例如:  输入:4 1 2
        输出:3  */
//首先这道题是输入的一行数据,不知道有多少个元素,因此首先读入一行字符串。
//然后根据空格的数目可以确定有多少种长度的绳子(n的大小)。
//接下来估计要使用动态规划的方法或者穷举,但是由于n是动态未知的,动态规划也学的不够扎实,没能解出来。
#include<iostream>
#include<string>
#include<sstream>

using namespace std;
int getres(int *d0,int *c0,int N0,int m)
{
    int sum0 = 0;
    for (int i = 0; i < N0;i++)
    {
        sum0 = sum0 + d0[i] * c0[i];
    }
    if(sum0==m)
        return 1;
    else
        return 0;
}
int main()
{
    string s0;
    getline(cin, s0);
    int len0 = s0.size();
    int N0 = 0;
    for (int i = 0; i < len0;i++)
    {
        if(s0[i]==' ')
            N0++;
    }
    int c0[N0];
    int m;
    int j1 = 0, j2 = 0;
    for (j2 = 0; j2 < len0;j2++)
    {
        if(s0[j2]==' ')
        {
            string m0 = s0.substr(j1, j2 - j1);
            stringstream ss0(m0);
            ss0 >> m;
            break;
        }       
    }
    j1 = j2+1;
    int beg0 = j1;
    int i0 = 0;
    for (j2 = beg0; j2 < len0;j2++)
    {
        if(s0[j2]==' ')
        {
            string css = s0.substr(j1, j2 - j1);
            stringstream ssc0(css);
            ssc0 >> c0[i0];
            i0++;
            j1 = j2 + 1;
        }    
    }
    string css = s0.substr(j1, j2 - j1);
    stringstream ssc0(css);
    ssc0 >> c0[i0];
    for (int i = 0; i < N0;i++)
        cout << c0[i] << endl;
        //上面为输入处理,目前已完成,总长度m,使用c0[0]到c0[N0-1]总共N0种长度的绳子凑。后面怎么处理就不会了,等过两天想到了解法再更新。



    return 0;
    }