zoukankan      html  css  js  c++  java
  • c++ --牛客刷题(美团2017真题)

    1. 题目:

    链接:https://www.nowcoder.com/questionTerminal/850fde3d987f4b678171abd88cf05710

    请设计一个算法能够完成两个用字符串存储的整数进行相加操作,对非法的输入则返回error

    输入描述:
    输入为一行,包含两个字符串,字符串的长度在[1,100]。
    输出描述:
    输出为一行。合法情况输出相加结果,非法情况输出error
    示例1
    输入
    123 123
    abd 123
    
    输出
    246
    Error
     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 int main(){
     6     char s1[102],s2[102];
     7     cin>>s1>>s2;  //输入俩字符串
     8     int len1=strlen(s1),len2=strlen(s2);
     9     int cnt=0;  //1表示有进位,0表示无进位
    10     bool flag=0;  //1表示合法输入,0表示非法输入
    11     int t=len2-1;
    12     for(int i=len1-1;i>=0;--i){  //从最低位开始相加,i>=0
    13         for(int j=t;j>=0&&s1[i]>='0'&&s1[i]<='9';--j){
    14             if(s2[j]>='0'&&s2[j]<='9'){
    15                 int m=s1[i]-'0'+s2[j]-'0';  //s[i]-'0',可将字符s[i]转换成对应整数值
    16                 if(i==0&&m>=10){  //最高位元素相加大于10,进位
    17                     cout<<1;  //输出进位
    18                 }
    19                 s1[i]=(m+cnt)%10+'0';  //将int值转化为对应的char值
    20                 cnt=(m>=10?1:0);  //进位值,{0,1}
    21                 t=j-1;
    22                 flag=1;
    23                 break;
    24             }
    25         }
    26     }
    27     if(flag){
    28         for(int i=0;i<len1;++i){
    29             if(s1[i]>='0'&&s1[i]<='9')
    30                 cout<<s1[i];
    31         }
    32         cout<<endl;
    33     }
    34     else
    35         cout<<"error"<<endl;
    36 
    37     return 0;
    38 }

    知识点:

    "char"型字符与"int"型数值字符的转换,如代码中第15(char转int)和19行(int转char);

    两个用字符串存储的整数进行相加操作,核心在第12到26行,注意cnt(进位)的处理;

    2. 题目:

    现在有一个数组,其值为从1到10000的连续增长的数字。出于某次偶然操作,导致这个数组中丢失了某三个元素,同时顺序被打乱,现在需要你用最快的方法找出丢失的这三个元素,并且将这三个元素根据从小到大重新拼接为一个新数字,计算其除以7的余数。

    例:丢失的元素为336,10,8435,得到的新数字为103368435,除以七的余数为2。

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <cmath>
     5 using namespace std;
     6 int main(){
     7     const int MAX=10001;
     8     int re[MAX]={0};  //re是一个包含MAX个0元素的数组
     9     int idx;
    10     while(cin>>idx){
    11         re[idx]=1;  //说明第idx个元素没有丢失
    12     }
    13     vector<int> vec;  //存储丢失的三个元素
    14     for(int i=1;i<MAX;++i){
    15         if(re[i]==0)
    16             vec.push_back(i);
    17     }
    18     sort(vec.begin(),vec.end());  //升序排列
    19     int rmd=0;  //rmd表示最终得到的余数
    20 
    21     //求余过程
    22     for(int i=0;i<vec.size();++i){
    23         int width=1+log10(vec[i]);  //某个丢失元素取对数再+1
    24         int temp=rmd*pow(10,width)+vec[i];  //vec[i]与vec[i-1]%7得到的余数串联
    25         rmd=temp%7;
    26     }
    27     cout<<rmd<<endl;
    28     return 0;
    29 }

    知识点:

    一种求余过程,代码第22到26行,注意第23行取对数。

  • 相关阅读:
    Server2008 Enterprise SP2 is now installed
    “广” && “专”的抉择 个人技术发展之我见!
    从需求到UI的实现策略
    浙江行之杭州
    Windows 7 6956 安装过程感言
    为了生活选择了Microsoft,为了理想仰慕Google
    腾讯2009的一个小BUG,发现腾讯竟然也在用nginx
    生活GOOGLE,GOOGLE生活
    整理下自己电脑所用的软件下一步一步一步走做好该做的
    面试的一天二天
  • 原文地址:https://www.cnblogs.com/cygalaxy/p/7455320.html
Copyright © 2011-2022 走看看