为什么前几个测试点过不了吗大家,麻烦帮我看一下,语法方面是没有错误的应该
#include
#include
#include
int ishuiwenshu(char*ch);
int main(void)
{//M[]即是我们读入的数组,第一次输入最大的位数是100,每次加法后最多往前进一位,最多30次,为了防止溢出,就把数组的大小放大了一点
char M[135];
//M[]则用于存储每次加法后得到的新数字字符串
char subM[135];
int N,i,k,n;
scanf("%d",&N);
scanf("%s",M);
n=strlen(M);
//输入的数字可能是16进制的,所以输入的可能会有字母,当遍历数组时,其ASCII码大于‘9’的时候,就是字母,为了方便,用tolower()都变成小写
for(i=0;iif(N=16&&M[i]>'9')
{
//处理输入的字母,转换成数字
M[i]=tolower(M[i]);
M[i]=M[i]-'a'+10;
}
}
//开始3最多的0次判断与加法
for(k=0;k<=30;k++)
{
//第一次进入该循环时,并不用subM[]数组来处理,但在加法过一次之后,为了要把上一次得到的subM[]的值赋给M[],然后再继续下面的加法
if(k>0)
{
n=strlen(subM);
for(i=0;i//在每一次开始加法前,先判断是否是回文数,如果是,跳出循环,然后printf();
if(ishuiwenshu(M))
break;
n=strlen(M);
for(i=0;M[i]//用subM[]来存储得到的新数字字符串
subM[i]=M[i]+M[n-1-i];
//处理进位问题
if(subM[i]>=N)
{
subM[i]=subM[i]%N;
subM[i+1]=subM[i]/N;
}
}
}
//因为当k=31时,也会跳出循环,所以需要判断是否是要输出STEP
if(k>30)
printf("Impossible!");
else
printf("STEP=%d",k);
}
//回文数判断的函数
int ishuiwenshu(char*ch)
{
int i,j;
i=0;
j=strlen(ch);
for(i=0;i<=(j/2);i++)
{
if(ch[i]!=ch[j-1-i])
return 0;
}
return 1;
}
#include <bits/stdc++.h>
using namespace std;
int n, q[1000001], l, w[1000001], ans;
string s;
void init()
{
int j = 0;
for(int i = s.length() - 1; i >= 0 ; i--)
{
if(s[i] >= '0' && s[i] <= '9')
{
q[++j] = s[i] - '0';
}
else
{
q[++j] = s[i] - 'A' + 10;
}
}
}
void add(int a[], int b[])
{
for(int i = 1; i <= l; i++)
{
a[i] += b[i];
a[i + 1] += a[i] / n;
a[i] %= n;
}
if(a[l + 1] > 0)
{
l++;
}
}
bool f(int a[])
{
int ln = l;
int i = 1;
int j = l;
while(ln--)
{
if(ln < l / 2)
{
break;
}
if(a[i] != a[j])
{
return false;
}
i++;
j--;
}
return true;
}
void turn(int a[])
{
int j = 0;
for(int i = l; i >= 1; i--)
{
w[++j] = a[i];
}
}
int main()
{
cin>>n>>s;
init();
l = s.length();
while(!f(q))
{
turn(q);
add(q, w);
ans++;
if(ans > 30)
{
break;
}
}
if(ans > 30)
{
printf("Impossible!");
}
else
{
printf("STEP=%d", ans);
}
return 0;
}
从左到右找到第一个偶数86,再找到86右边第一个奇数787,冒泡;
此时i = 1,继续,i++;
同理;
越到后面要移动的数字越多;