解题思路:
注意事项: 在这里我用数组从a[0]开始存放数的最低位,a[i]存放高位,便于适应结果数的位数增长,易实现算法
参考代码:
#include<stdio.h> #include<string.h> void transform(char s[],int a[]){ //将输入的字符串转换为int型数的集合 int i=0; while(1){ if(s[i]>='0'&&s[i]<='9') a[i]=(int)s[i]-48; else if(s[i]>='a'&&s[i]<='f') a[i]=(int)s[i]-87; else if(s[i]>='A'&&s[i]<='F') a[i]=(int)s[i]-55; else break; i++; } } void reverse(int a[],int b[],int d){ //翻转数字 int i; for(i=0;i<d;i++) b[i]=a[d-i-1]; } void add(int a[],int b[],int *d,int k){ //相加 int fla=0,i,c[100]; for(i=0;i<*d;i++){ c[i]=(a[i]+b[i]+fla)%k; fla=(a[i]+b[i]+fla)/k; } if(fla!=0){ //最终进位若为非0,则表示d+1位,不为0有效 c[i]=fla; i++; //重新调整数的位数(加1位) } *d=i; for(i=0;i<*d;i++) a[i]=c[i]; //将结果数放置到a[]数组 } int huiwen(int a[],int d){ //判断回文 int i,flag=1; for(i=0;i<d/2;i++) if(a[i]!=a[d-i-1]) flag=0;//若存在1对数不相等,则非回文,返回0,否则返1 return flag; } int main(){ int a[100],b[100]; //a存初始数(或结果数),b存翻转得到的数 int k,num=0,d; //num记录计算次数,d为数a的长度 char s[100]; scanf("%d%s",&k,s); transform(s,a); d=strlen(s); while(num<=30){ reverse(a,b,d); add(a,b,&d,k); num++; if(huiwen(a,d)) break; //执行到满足回文数时退出循环,成功! } if(num!=31) printf("STEP=%d",num); else printf("Impossible!"); return 0; }
0.0分
0 人评分
printf基础练习2 (C语言代码)浏览:605 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:481 |
C语言程序设计教程(第三版)课后习题7.1 (C语言代码)浏览:761 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:583 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:400 |
简单的a+b (C语言代码)浏览:600 |
C语言训练-求函数值 (C语言代码)浏览:599 |
【简单计算】 (C语言代码)浏览:642 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1260 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:438 |