c语言这个程序输出结果为什么是24?

Python020

c语言这个程序输出结果为什么是24?,第1张

这是因为编译时存在字节对齐的原因,字节对齐主要是为了提高内存数据读取速度。如果你想要让结果等于实际大小,你可以设置字节对齐大小如

#pragma pack(1)

取消设置

#pragma pack()

字节对齐的规则如下:

结构体的大小等于其最大成员的整数倍;

结构体成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍。

比如double型成员的首地址相对于结构体首地址的偏移量应该是8的倍数;

满足前两条规则后,编译器会在结构体成员之后进行字节填充。

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

char op[3], o[5]="+-*/"

float n[4], on[10]

int used[4] = {0}, top=0, tp=0, x

void chk(float k)

void search24(int d)

float calc(float n1, float n2, char o)

void make(int i, float p, float q, char o, int d)

int main( void )

{

printf("please input 4 card number:\n")

  scanf("%f%f%f%f", &n[0], &n[1], &n[2], &n[3])

  search24(0)

  printf("No answer.\n")

  return 0

}

void chk(float k)

{

  if( (tp != 3) || ( fabs(k-24.0) >0.000001 )) //没有用完3个运算符或者结果不为24就退出.

return

  for(x=0x<5x+=2)                                            //这样设计是为了使3个选中的符号都可以得到输出.

      printf("%g%c%g=%g\n", on[x], op[x/2], on[x+1],         //分析得到的.

                             calc(on[x], on[x+1], op[x/2]))

system("pause")

  exit(0)

}

float calc(float n1, float n2, char o)

{

  switch(o){

      case '+': return (n1+n2)

      case '-': return (n1-n2)

      case '*': return (n1*n2)

      case '/': return (n1/n2)

default: exit(0)

  }

}

void make(int i, float p, float q, char o, int d)

{

  if(fabs(q)>0.000001 || o!='/')   //除数不为0,或者为0的时候不能为除数.

      n[i] = calc(p, q, o)

  op[tp++] = o

chk(n[i])

  search24(d+1)

tp--   //因为是全是全局变量,所以在做试验性的循环递归问题时,如果失败,要在递归函数后面重新恢复回原来的值

}

void search24(int d)

{

  int i, j, k

  float p, q

  if(d>=3)    //控制递归深度,就是运算符的输出个数.

return

  for(i=0i<4i++)

      for(j=0j<4j++)

          if( (i!=j)&&(used[i]+used[j] == 0) ) //i!=j是防止重复,(used[i]+used[j] == 0)是防止又再匹配已经用过的j,

                                    //但是i可以新来.

 {

              used[j] = 1  //j得到匹配之后,赋值为1,表示已经使用

  p=n[i]

  q=n[j]

              on[top++] = p

  on[top++] = q

              for(k=0k<4k++)  //运算符的循环试用.

                  make(i, p, q, o[k], d)

              n[i] = p       //因为是全是全局变量,所以在做试验性的循环递归问题时,

  used[j] = 0    //如果失败,要在递归函数后面重新恢复回原来的值

              top -= 2       //

          }

}

出处:http://blog.sina.com.cn/s/blog_491de9d60100d5er.html

两种情况:

一、整数型24,通过取余再整除,从低位开始把每一位数字取出累加(每次累加先乘以10)。

二、字符串24,直接将字符串倒置,比如用2个指针分别指向字符串首尾 ,然后同时往中间移动,每次交换值,实现倒置。

下面是代码,两函数分别对应上面2个情况:

#include<stdio.h>

#include<string.h>

int dzInt(int n)//整数倒置

char *dzStr(char *str)//字符串倒置

int main()

{

  int n=24

  char str[3]="24"

  printf("整数%d倒置后:%d\n",n,dzInt(n))

  printf("字符串24倒置后:%s\n",dzStr(str))

  return 0

}

int dzInt(int n)

{

  int s=0

  while(n>10)

  {

      s=s*10+n%10

      n=n/10

  }

  s=s*10+n

  return s

}

char *dzStr(char *str)

{

  char temp,*p0=str,*p1=&str[strlen(str)-1]

  while(p0<p1)

      temp=*p0,*p0=*p1,*p1=temp,p0++,p1--

  return str

}