每日一题,今天做的是一道经典题——高精度加法,最开始写的时候着实被恶心到了,字符串读进来要进行处理,同时十六进制又需要特别判断(其实把字符串一个个转化为数组就好了,就可以避免十六进制的单独讨论,没有想到导致极其麻烦!!!!),中途还因为字符串的原因走了很多坑。
不过还是有些小收获的,代码尝试进行模块化,出bug时能比较好的发现问题所在,以及写繁琐的题不要着急,埋头写过去就行,目前代码能力还是不强,构思能力较差,往往是这儿一点想法,那儿一点想法,不能把边界条件想清楚。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int count;
void my_reverse(char *s1,char *s2)
/*第一个传入字符串为原始字符串,第二个字符串为翻转后的字符串*/
{
int length=strlen(s1);
for(int i=length-1;i>=0;i--)
s2[length-1-i]=s1[i];
s2[length]='\0';
return ;
}
int check(char *s1)
/*检查是否是回文数,首尾循环开展*/
{
int length=strlen(s1)-1;
int head=0,tail=length;
for(;head<tail;head++,tail--)
{
if(s1[head]=='0')
head+=1;
if(s1[head]!=s1[tail])
return 0;
}
return 1;
}
void string_plus_sex(char* s1,char *s2)
//处理十六进制的特殊函数
{
//首先统一化为小写
for(int i=0;s1[i]!='\0';i++)
{
if(s1[i]>='A'&&s1[i]<='Z')
s1[i]+='a'-'A';
if(s2[i]>='A'&&s2[i]<='Z')
s2[i]+='a'-'A';
}
int length=strlen(s1),carry=0,result=0;
for(int i=length-1;i>=0;i--)
{
if(s1[i]<='9')
{
if(s2[i]<='9')//两个加数都是数字
{
result=(s1[i]-'0'+s2[i]-'0'+carry)%16;
carry=(s1[i]-'0'+s2[i]-'0'+carry)/16;
if(result>9)
s1[i]='a'+result-10;
else s1[i]=result+'0';
}
else
{
result=(s2[i]-'a'+10+s1[i]-'0'+carry)%16;
carry=(s2[i]-'a'+10+s1[i]-'0'+carry)/16;
if(result>9)
s1[i]='a'+result-10;
else s1[i]=result+'0';
}
}
else
{
if(s2[i]<='9')
{
result=(s1[i]-'a'+10+s2[i]-'0'+carry)%16;
carry=(s1[i]-'a'+10+s2[i]-'0'+carry)/16;
if(result>9)
s1[i]='a'+result-10;
else s1[i]=result+'0';
}
else
{
result=(s2[i]-'a'+10+s1[i]-'a'+10+carry)%16;
carry=(s2[i]-'a'+10+s1[i]-'a'+10+carry)/16;
if(result>9)
s1[i]='a'+result-10;
else s1[i]=result+'0';
}
}
}
if(carry)
//如果有进位则右移
{
for(int i=length;i>=0;i--)
{s1[i+1]=s1[i];s2[i+1]=s2[i];}
s1[0]=0;s1[0]=carry+'0';
}
}
void string_plus(char* s1,char *s2,int n)
{
int length=strlen(s1),result,carry=0;
//单独处理十六进制数
if(n==16)
{
string_plus_sex(s1,s2);
return ;
}
for(int i=length-1;i>=0;i--)
{
result=(s1[i]-'0'+s2[i]-'0'+carry)%n;
carry=(s1[i]-'0'+s2[i]-'0'+carry)/n;
s1[i]=result+'0';
}
if(carry)
//如果有进位则右移
{
for(int i=length;i>=0;i--)
{s1[i+1]=s1[i];s2[i+1]=s2[i];}
s1[0]=0;s1[0]=carry+'0';
}
}
int judge(char *s,int n)
/*将字符串反转后相加判断是否是回文数,若是则返回,若不是,则继续递归*/
{
char* s_res=(char*)malloc(sizeof(char)*102);
my_reverse(s,s_res);
string_plus(s,s_res,n);
count++;
if(check(s)||count>30)
return count;
else judge(s,n);
}
int main()
{
int N;//进制数
char M[102];//待处理的数
scanf("%d %s",&N,M);//处理输入
int i=judge(M,N);
if(i<=30)
printf("STEP=%d",i);
else printf("Impossible!");
return 0;
}