先写了一个反转数的代码,反转函数输入是一个字符串,返回值是一个 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; }