閱讀902 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 技術人員談管理之進度管理案例論文
  下一篇:go php隨機字符串