2.1 基础-数字翻转
题目
对于一个整数X,定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如:
如果 X = 123,则rev(X) = 321;
如果 X = 100,则rev(X) = 1.
现在给出整数x和y,要求rev(rev(x) + rev(y))为多少?
输入描述:
输入为一行,x、y(1 ≤ x、y ≤ 1000),以空格隔开。
输出描述:
输出rev(rev(x) + rev(y))的值
示例1
输入
123 100
输出
223
推荐第二种和第四种写法~
代码一(比较繁琐)
#include <iostream>
using namespace std;
int main()
{
int x,y,a,b,k,j,i;
int c[1001],d[1001],e[1001];
cin>>x>>y;
if(x==0 && y==0) cout<<"0";
else
{
for(i=0;x>0;x/=10)
{
c[i]=x%10;
i++;
}
for(j=i-1;j>=0;j--)
{
if(c[j]!=0) break;
}
a=b=0;
for(i=0;i<=j;i++)
{
a=a*10+c[i];
}
for(i=0;y>0;y/=10)
{
d[i]=y%10;
i++;
}
for(k=i-1;k>=0;k--)
{
if(d[k]!=0) break;
}
for(i=0;i<=k;i++)
{
b=b*10+d[i];
}
int n=a+b;
for(i=0;n>0;n/=10)
{
e[i]=n%10;
i++;
}
for(j=0;j<i;j++)
{
if(e[j]!=0) break;
}
for(k=j;k<i;k++)
{
cout<<e[k];
}
}
cout<<endl;
return 0;
}
代码二(锻炼思维)
#include <iostream>
#include <string.h>
using namespace std;
const int MAX=1e3 + 10;
int main()
{
char x[100],y[100];
int l1,l2,a,b,j,i;
while(cin>>x>>y)
{
a=b=0;
l1=strlen(x);
l2=strlen(y);
for(i=l1-1;i>=0;i--)
{
a=a*10+x[i]-'0';
}
for(i=l2-1;i>=0;i--)
{
b=b*10+y[i]-'0';
}
a=a+b;
for(i=0;a>0;i++)
{
if(a%10) break;
a/=10;
}
for(j=0;a>0;j++)
{
cout<<a%10;
a/=10;
}
cout<<endl;
}
return 0;
}
代码三
#include<bits/stdc++.h>
using namespace std;
char x[100],y[100];
vector<int> ann;
int main(){
cin>>x>>y;
int l1=strlen(x);
int l2=strlen(y);
reverse(x,x+l1);
reverse(y,y+l2);
int n,m;
n=m=0;
for(int i=0;i<l1;i++){
n=n*10+x[i]-'0';
}
for(int i=0;i<l2;i++){
m=m*10+y[i]-'0';
}
int kk=n+m;
while(kk){
ann.push_back(kk%10);
kk/=10;
}
int id=10000;
for(int i=0;i<ann.size();i++){
if(ann[i]){
id=i;
break;
}
}
if(id==10000){
cout<<0<<endl;
return 0;
}
for(int i=id;i<ann.size();i++) cout<<ann[i];
puts("");//换行
return 0;
}
代码四(简洁高效)
#include <iostream>
using namespace std;
int rev(int a)
{
int ans=0;
while(a>0)
{
ans=ans*10+a%10;
a/=10;
}
return ans;
}
int main()
{
int x,y;
while(cin>>x>>y)
{
cout<<rev(rev(x)+rev(y))<<endl;
}
return 0;
}