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