leetcode Plus One
题目:用数组的每一位来存储的一个整数,加上一,再返回这个整数,这个整数的每一位都存储在一个数组内,答案是返回这个数组。例如:数组[9,0,9,9],则返回数组[9,1,0,0]。
分析: 题目思路比较简答,可以类比到两大整数如何相加的问题,每一位进行相加,存储好进位,就可以完成最后的结果。看代码。
vector<int> plusOne(vector<int>& digits)
{
vector<int> ans;
vector<int> te;
if(digits.size()==0)
{
return ans;
}
int carry=0; //记录进位
int tem=digits[digits.size()-1]+1;
if(tem>=10)
{
te.push_back(tem%10);
carry=1;
}
else
te.push_back(tem);
for(int i=digits.size()-2;i>=0;i--)//相加,有不断的进位的时候相加
{
tem=digits[i]+carry;
if(tem>=10)
{
te.push_back(tem%10);
carry=1;
}
else
{
te.push_back(tem);
carry=0; //没有进位要清零
}
}
if(carry==1)//全部加完之后,看其进位是否还有
te.push_back(carry);
for(int i=te.size()-1;i>=0;i--)
{
ans.push_back(te[i]);
}
return ans;
}
题目扩展: 在开头说的那样,这题可以看成是两个大数的相加,用字符串表示,每一位相加,记录carry,逐位相加。具体题目可以参考zoj1205,代码见下。
void add_two_nums()
{
char s1[102];
char s2[102];
while(scanf("%s%s",s1,s2)!=EOF)
{
int dex[102];//记录每一位
int i=strlen(s1)-1;
int j=strlen(s2)-1;
int k=0;
memset(dex,0,sizeof(dex));
for(;i>=0||j>=0;i--,j--,k++)//相加
{
if(i>=0)
{
if(s1[i]>='0'&&s1[i]<='9')
dex[k] +=s1[i]-'0';
else
dex[k] +=s1[i]-'a'+10;
}
if(j>=0)
{
if(s2[j]>='0'&&s2[j]<='9')
dex[k] +=s2[j]-'0';
else
dex[k] +=s2[j]-'a'+10;
}
if(dex[k]>=20)
{
dex[k+1] +=1;
dex[k]=dex[k]%20;
}
}
if(dex[k]==0)
k--;
if(k==-1)
cout<<"0"<<endl;
else
{
for(;k>=0;k--)//输出最后的结果
printf("%c",elem[dex[k]]);
cout<<endl;
}
}
}
总结:这道题目也属于简单的,但是可以联系到两个大数的相加,甚至是不同进制的数相加。