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