原题链接:信息学奥赛一本通T1309-回文数
高精度题的思路是把数据存于数组进行处理,其个别题型在Java语言中可以使用BigInteger BigDecimal 进行处理。
C语言解决这题型时一般采用将数组的数据长度存放在A[0]头元素,Java也可。
此处是使用传统的数组解题,数组长度单独存放在cur变量中:
因为是n进制所以把
当前位规范从A[i]%10 到 A[i]%n
进位规范从A[i]/10 改成 A[i]/n
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String str=sc.next(); //字符串接收输入
int[] a=new int[1000000];
int[] b=new int[1000000];
int cur=str.length(); //此时数据长度为str长
for(int i=0;i<str.length();i++){ //存放入int数组
if(str.charAt(i)>='0' && str.charAt(i)<='9') a[i]=str.charAt(i)-'0';
else if(str.charAt(i)>='A' && str.charAt(i)<='Z') a[i]=str.charAt(i)-'A'+10;
else a[i]=str.charAt(i)-'a'+10; //90%正确的是因为未考虑小写字母的情况。。。。
}
int ans=0;
while(true){
if(ans>30){ //加法超过30次,则退出
System.out.println("Impossible");
break;
}
else{
if(huiwen(a,cur)){ //判断是否回文
System.out.println(ans);
break;
}
//高精度加法模板
for(int i=0;i<cur;i++) b[i]=a[cur-i-1];//
for(int i=0;i<cur;i++) a[i]+=b[i];//
for(int i=0;i<cur;i++){ //
a[i+1]+=a[i]/n; //
a[i]%=n; //
} //
if(a[cur]>0) cur++; //(如果最高位有进位,数据长加1)
ans++;
}
}
}
static boolean huiwen(int[] a,int cur){
for(int i=0;i<cur;i++)
if(a[i]!=a[cur-i-1])
return false;
return true;
}
}
7.3 分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复