我不懂了啊大家,这代码怎么越改越怪呢
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int ishuiwenshu(char*ch);
int main(void)
{//M[]即是我们读入的数组,第一次输入最大的位数是100,每次加法后最多往前进一位,最多30次,为了防止溢出,就把数组的大小放大了一点
char M[135];
//M[]则用于存储每次加法后得到的新数字字符串
char subM[135],ssubM[135];
int N,i,j,k,n;
scanf("%d",&N);
scanf("%s",M);
n=strlen(M);
//输入的数字可能是16进制的,所以输入的可能会有字母,当遍历数组时,其ASCII码大于‘9’的时候,就是字母,为了方便,用tolower()都变成小写
if(ishuiwenshu(M))
printf("STEP=0");
if(!ishuiwenshu(M))
{
for(i=0;i<n;i++)
{
if(N==16&&M[i]>'9')
{
//处理输入的字母,转换成数字
M[i]=tolower(M[i]);
M[i]=M[i]-'a'+10;
}
}
//开始3最多的0次判断与加法
for(k=1;k<=30;k++)
{
//第一次进入该循环时,并不用subM[]数组来处理,但在加法过一次之后,为了要把上一次得到的subM[]的值赋给M[],然后再继续下面的加法
if(k>1)
{
n=strlen(subM);
for(i=0;i<n;i++)
{
M[i]=ssubM[i];
ssubM[i]=0;
subM[i]=0;//将subM[]同时初始化为0,防止上一次的数值产生误差
}
}
for(i=0;i<n;i++)
{
//用subM[]来存储得到的新数字字符串
subM[i]=M[i]+M[n-1-i];
ssubM[n-1-i]=subM[i];
}
for(j==0;j<n;j++)
{
//处理进位问题
if(ssubM[j]>=N)
{ //需要逆位存储,不然反过来会类似于从十位开始往前近
ssubM[j]=subM[j]%N;
ssubM[j]=subM[j]/N;
}
}
n=strlen(ssubM);
for(i=0;i<n;i++)
{
//用subM[]来存储得到的新数字字符串
subM[n-1-i]=ssubM[i];
}
//在每一次开始加法后,先判断是否是回文数,如果是,跳出循环,然后printf();
if(ishuiwenshu(subM))
break;
}
//因为当k=31时,也会跳出循环,所以需要判断是否是要输出STEP
if(k>30)
printf("Impossible!");
else
printf("STEP=%d",k);
}
return 0;
}
//回文数判断的函数
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;
}
首当其冲的就是通用寄存器
然后就是标志寄存器(难哭,都是一些关于计算的问题)
“人如其名”,既然名字叫做标志寄存器,当然里面会有众多的标志位,这些标志位记录了CPU执行指令过程中的一系列状态
6个状态标志位
CF—进位标志,加法时的最高位(第7位或第15位)产生进位或减法时最高位出现借位,则CF=1,否则CF=0;
AF—辅助进位标志,供BCD码使用。当(第3位)出现进位或借位时AF=1,否则AF=0;
OF—溢出标志,带符号数进行算术运算时,其结果超出了8位或16位的表示范围,产生溢出,则OF=1,否则OF=0;
ZF—零标志,运算结果各位都为零,则ZF=1,否则ZF=0;
SF—符号标志,运算结果为负数时,即运算结果的最高位为1,则SF=1,否则SF=0;
PF—奇偶标志,反映操作结果中“1”的个数的情况,若有偶数个“1”,则PF=1,否则PF=0。
3个控制标志位
(这是别人写的一篇非常好的关于标志寄存器的文章(http://blog.csdn.net/wangkehuai/article/details/7337328) ,很惭愧本人学的不精)
第三个指令寄存器
第四个段寄存器
以上就是全部要介绍的寄存器了,需要说明一下的是,这并不是x86CPU全部所有的寄存器,除了这些,还存在调试寄存器、描述符寄存器、任务寄存器、模型特定寄存器等。
这段代码的问题在于有一处赋值语句写成了判等式,导致程序逻辑出现了问题。具体来说,在第27行,判断输入数字是否为16进制时,应该用双等号判等,而不是单等号。因为单等号会把N赋值为16,导致程序不能正确处理16进制数字中的字母。
正确的代码如下:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int ishuiwenshu(char* ch);
int main(void)
{
char M[135];
char subM[135];
int N, i, k, n;
scanf("%d", &N);
scanf("%s", M);
n = strlen(M);
for (i = 0; i < n; i++) {
if (N == 16 && M[i] > '9') {
M[i] = tolower(M[i]);
M[i] = M[i] - 'a' + 10;
}
}
for (k = 0; k <= 30; k++) {
if (k > 0) {
n = strlen(subM);
for (i = 0; i < n; i++) {
M[i] = subM[i];
subM[i] = 0;
}
}
if (ishuiwenshu(M)) {
break;
}
n = strlen(M);
for (i = 0; i < n; i++) {
subM[i] = M[i] + M[n - 1 - i];
if (subM[i] >= N) {
subM[i] = subM[i] % N;
subM[i + 1] = subM[i] / N;
}
}
}
if (k > 30) {
printf("Impossible!");
} else {
printf("STEP=%d", k);
}
return 0;
}
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;
}
注意,在修改了代码之后,还需要测试代码是否能够正确运行,以确保修改的正确性。