poj 1504 Adding Reversed Numbers【反转数字】
先写了一个反转数的代码,反转函数输入是一个字符串,返回值是一个 int64 型,但是发现这样还是不行,需要输入和输出一样的反转函数才可以。要么输入字符串,返回字符串;要么输入整数,返回整数
之后又改变方法,在纸上画画就知道。
比如 26500 7657 ,反转相加就是652+7657=8129,再反转就是 9281 ,跟直接一位位相加 2+7=9,6+6=2,5+5+1=1,0+7+1=8 相对的位数一样,这就意味着不必一个个数翻来翻去了。。。
再如 26500 8657,反转相加就是652+8657=8130,再反转就是 318 ,跟直接一位位相加 2+8=0,6+6+1=3,5+5+1=1,0+7+1=8 相对的位数也一样。。。
我把字符串转成数字更容易处理,去掉开始和结尾的 0 (比如03180,去掉才是318)就OK了
AC的代码:
#include <iostream>
#include <string.h>
char a[105],b[105];
int aNum[105],bNum[105];
void exchange()
{
char t[105];
strcpy(t,a);
strcpy(a,b);
strcpy(b,t);
}
void Numnify()
{
memset(aNum,0,sizeof(aNum));
memset(bNum,0,sizeof(bNum));
int i;
for(i=0;i<strlen(a);i++)
aNum[i]=a[i]-'0';
for(i=0;i<strlen(b);i++)
bNum[i]=b[i]-'0';
}
void Process()
{
// a 数组永远都是最短的那个
if(strlen(a)>strlen(b))
exchange();
Numnify(); //数字化
//正式开始处理
int i,tmp;
for(i=0;i<strlen(b);i++)
{
tmp=aNum[i]+bNum[i];
if(tmp>=10)
{
bNum[i+1]++;
bNum[i]=tmp-10;
}
else
bNum[i]=tmp;
}
int startPos,endPos;
for(i=0; ;i++)
{
if(bNum[i]!=0)
break;
}
startPos=i;
for(i=104; ;i--)
{
if(bNum[i]!=0)
break;
}
endPos=i;
for(i=startPos;i<=endPos;i++)
printf("%d",bNum[i]);
printf("\n");
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s%s",a,b);
Process();
}
return 0;
}
反转函数之一:
#include <iostream>
#include <string.h>
#include <math.h>
__int64 numVers(char n[],int len)
{
__int64 ans=0;
for(int i=0;i<len;i++)
ans+=(n[i]-'0')*((int)(pow(10,i)));
return ans;
}
int main()
{
char a[105];
__int64 ans;
while(1)
{
scanf("%s",a);
ans=numVers(a,strlen(a));
printf("反转后的数为:%I64d\n",ans);
}
return 0;
}
反转函数之二:
#include <iostream>
#include <string.h>
void numVers(char a[],int len)
{
//求出真实的反转字符长度
while(a[len-1]=='0')
len--;
a[len]='\0';
//test ok
//printf("%d\n",strlen(a));
int i;
char tmp;
//交换 a[i] 和 a[len-1-i]
for(i=0;i<len/2;i++)
{
tmp=a[len-1-i];
a[len-1-i]=a[i];
a[i]=tmp;
}
}
int main()
{
char a[105];
while(1)
{
scanf("%s",a);
numVers(a,strlen(a));
printf("反转后的数为:%s\n",a);
}
return 0;
}
最后更新:2017-04-03 14:54:04