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


相关文章
|
7月前
|
C++
【PTA】​L1-050 倒数第N个字符串 ​ (C++)
【PTA】​L1-050 倒数第N个字符串 ​ (C++)
63 0
【PTA】​L1-050 倒数第N个字符串 ​ (C++)
|
7月前
|
存储 算法 Java
【牛客-算法】NC57 反转数字
题目描述 原题:NC57 反转数字 描述 给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果 1.只反转数字部分,符号位部分不反转
51 0
|
机器学习/深度学习
CF1304B Longest Palindrome(可逆转符号,数学分析,回文串)
CF1304B Longest Palindrome(可逆转符号,数学分析,回文串)
45 0
|
网络架构
POJ 3250 Bad Hair Day、POJ 2796 Feel Good(单调栈)
POJ 3250 Bad Hair Day、POJ 2796 Feel Good(单调栈)
力扣刷题记录——412. Fizz Buzz、414. 第三大的数、415. 字符串相加
力扣刷题记录——412. Fizz Buzz、414. 第三大的数、415. 字符串相加
力扣刷题记录——412. Fizz Buzz、414. 第三大的数、415. 字符串相加
|
机器学习/深度学习 人工智能 算法
CF1446D Frequency Problem(思维 前缀和 根号分治 双指针)
CF1446D Frequency Problem(思维 前缀和 根号分治 双指针)
93 0
HDOJ(HDU) 2113 Secret Number(遍历数字位数的每个数字)
HDOJ(HDU) 2113 Secret Number(遍历数字位数的每个数字)
120 0