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行取对数。

 

posted @ 2017-08-30 21:11  halo_vagabond  阅读(665)  评论(0编辑  收藏  举报