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