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;
}


你可能感兴趣的:(poj 1504 Adding Reversed Numbers【反转数字】)