分类：电脑/网络-软件
问题：C语言里里难题（完美的代价），求助解释解释一下这个程序中的n,n 
解释一下这个程序中的 n,n1,x,y,m,i,j,k,tong，*a,b[27],ch,dan分别有什么作用，能翻译一下最好了/*完美的代价一、实验内容与要求回文串，是一种特殊的字符串，它从左往右读和从右往左读是一样的。有人认为回文串是一种完美的字符串。现在给你一个字符串，它不一定是回文的，请你计算最少的交换次数使得该串变成一个回文串。这里的交换指将字符串中两个相邻的字符互换位置，例如所给的字符串为mamad，第一次交换ad，得到mamda；第二次交换md，得到madma；第三次交换ma，得到madam （回文！完美！）输入要求：解释一下这个程序中的 n,n1,x,y,m,i,j,k,tong，*a,b[27],ch,dan分别有什么作用，能翻译一下最好了/*完美的代价一、实验内容与要求回文串，是一种特殊的字符串，它从左往右读和从右往左读是一样的。有人认为回文串是一种完美的字符串。现在给你一个字符串，它不一定是回文的，请你计算最少的交换次数使得该串变成一个回文串。这里的交换指将字符串中两个相邻的字符互换位置，例如所给的字符串为mamad，第一次交换ad，得到mamda；第二次交换md，得到madma；第三次交换ma，得到madam （回文！完美！）输入要求：程序要求从读入数据。第一行是一个正整数N（N <= 8000），表示所给字符串的长度，第二行是所给的字符串，长度为N且只包含小写英文字母。输出要求：如果所给字符串能经过若干次交换变成回文串，则输出所需的最少交换次数；否则，输出Impossible。输入示例1：5  （N＝5）输出示例1：3  （表示字符串"mamad"最少需要经过3次交换即可得到回文串！）输入示例2：6  （N＝6）输出示例2：Impossible  (表示字符串"aabbcd"无法转换为回文串！)*/#include <stdio.h>#include <stdlib.h> main() {  int n,n1,x,y=0,m=0,i,j,k,tong;   char *a,b[27],ch,dan=0;   printf("n=");   scanf("%d",&n);   a=(char *)malloc(sizeof(char)*n+1);   a[n]=0;   b[0]=0;   scanf("%s",a);   for(i=0,k=0;i<n;i++)   {     tong=0;     for(j=0;b[j]!=0;j++)       if(a[i]==b[j])        tong=1;       if(tong==0)       {         for(j=i+1,x=1;j<n;j++)           if(a[i]==a[j])            x++;           if(x%2==1)           {             dan=a[i];             y++;           }           if(y==2)           {             printf("Impossible\n\n");             exit(0);           }           b[k]=a[i];           b[k+1]=0;           k++;       }   }   for(i=0;i<n/2;i++)   {     if(dan!=0)       if(a[i]==dan)       {         ch=a[i];         a[i]=a[i+1];         a[i+1]=ch;         m++;       }       for(j=n-1-i;j>i;j--)         if(a[i]==a[j])         {           break;         }         for(k=j;k<n-1-i;k++)         {           ch=a[k];           a[k]=a[k+1];           a[k+1]=ch;           m++;         }   }   printf("%s\n %d\n\n",a,m);   getchar(); }
回答：#include <std.h> #include <stdlib.h> main() {   int n,n1,x,y=0,m=0,i,j,k,tong;  char *a,b[27],ch,dan=0;   //n表示字符串的字母个数，n1没有用，i，j，k是循环控制变量同时也是数组的下标  //a用来保存待判定的字符串，b用来存放已出现的字母  //其他变量在程序中有解释  printf("n="); //输入提示  scanf("%d",&n); //输入字符串包含字母的个数  a=(char *)malloc(sizeof(char)*n+1);//为字符串分配存储空间   a[n]=0; //给字符串加结束符  b[0]=0; //给b数组加结束符  scanf("%s",a); //输入字符串  for(i=0,k=0;i<n;i++) //扫描字符串，统计每个字母出现的次数（单数、双数）  {     tong=0; //标识在已扫过的字符串中是否存在当前字母，0表示不存在，1表示存在    for(j=0;b[j]!=0;j++) //判断当前字母是否已出现过，在b数组中保存有已出现的字母      if(a[i]==b[j])         tong=1;     if(tong==0) //tong=0意味出现了新的字母，需要统计新字母出现的次数    {        for(j=i+1,x=1;j<n;j++)           if(a[i]==a[j])         x++; //x记录新字母出现的次数       if(x%2==1) //如果新字母出现的次数为单数       {           dan=a[i]; //保存出现次数为单数的新字母        y++; //统计出现次数为单数的字母个数       }        if(y==2) //如果出现次数为单数的字母个数为2，则绝对不能构成回文       {         printf("Impossible\n\n");         exit(0);        }        b[k]=a[i]; //将出现的新字母存放至b数组       b[k+1]=0;        k++;     }   }   for(i=0;i<n/2;i++) //从前向后扫描字符串  {     if(dan!=0) //如果字符串中存在单个字母      if(a[i]==dan) //将单个字母向后移动一位，因为在回文中单个字母必在中间位置      {         ch=a[i];         a[i]=a[i+1];         a[i+1]=ch;         m++;       }     for(j=n-1-i;j>i;j--) //从后向前找第一个与i位置上相同的字母      if(a[i]==a[j])       {         break;       }     for(k=j;k<n-1-i;k++) //将找到的与i位置上相同的字母移到对称的位置（n-1-i）上，计数移动次数    {       ch=a[k];       a[k]=a[k+1];       a[k+1]=ch;       m++;     }   }   printf("%s\n %d\n\n",a,m);   getchar(); }