1 全排序
//全排序
#include<stdio.h>
#include
<stdlib.h>
void output(int a[],int k,int m)
{
    
int i,temp;
    
if(k>m)
    {
        
for(i=0;i<=m;i++)
            printf(
"%d",a[i]);
        printf(
"\n");
        
return ;
    }
    
for(i=k;i<=m;i++)
    {
        temp
=a[i];
        a[i]
=a[k];
        a[k]
=temp;
        output(a,k
+1,m);
        temp
=a[i];
        a[i]
=a[k];
        a[k]
=temp;
    }
}

int main()
{
    
int num[]={1,2,3,4};
    output(num,
0,3);
    
return 0;
}
输出结果:
1234
1243
1324
1342
1432
1423
2134
2143
2314
2341
2431
2413
3214
3241
3124
3142
3412
3421
4231
4213
4321
4312
4132
4123


组合
void combin(char a[],int n,int m,int k)//数组a中有m个元素,从中选取3个进行组合
{
    
int i;
    
if(k>2)
    {
        printf(
"%s\n",b);
    }
    
else
    {
    
for(i=n;i<m;i++)
    {
        b[k]
=a[i];
        combin(a,i
+1,m,k+1);

    }}
}
2 有N个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#include <stdio.h>
#include 
<stdlib.h>
#define nmax 50
main()
{    
   
int i,k,m,n,num[nmax],*p;
   printf(
"please input the total of numbers:");
   scanf(
"%d",&n);
   p
=num;
   
for(i=0;i<n;i++)
 
*(p+i)=i+1;
 i
=0;
 k
=0;
 m
=0;
 
while(m<n-1)
  {
    
if(*(p+i)!=0) k++;
    
if(k==3)
      { 
          
*(p+i)=0;
        k
=0;
        m
++;
  }
   i
++;
   
if(i==n) i=0;
    }
   
while(*p==0) p++;
   printf(
"%d is left\n",*p);
}

3 字符串反转
思想:
将第一个字符与最后一个字符交换,将第二个字符与倒数第二个字符交换....依次类推......
#include<iostream>
#include
<string>
#include
<assert.h>
using namespace std;
int main(void)
{
  
char ch[100];
  
char temp;
  
int begin,end;
  printf(
"please input the string:");
  fgets(ch,
100,stdin);
  begin
=0;
  end
=strlen(ch)-2;// 因为fgets得到的一行包括换行符
  
while(begin<end)
  {
      temp
=ch[begin];
      ch[begin]
=ch[end];
      ch[end]
=temp;
      begin
++;
      end
--;
  }
  printf(
"%s",ch);
  getchar();
  
return 0;
4.不用除法(即不能使用"/"号)和库函数,计算285 / 16的商和余数, 要求效率尽量高.
int main()
{    
int m = 285;
     
int n = 16;
     
int shan  = 0;
     
int yushu = 0;
    
    
while ( m>0 )
      {
        m 
= m-n;
        shan 
++;
      }
    
if ( m<0 )
     {
        shan
--;
        yushu 
= m+n;
     }
    printf (
"285/16=%d*%d+%d",n,shan,yushu);
}

5 'a' 97   'A' 65

6//求两个数的最大公约数
  #include<stdio.h>
  #include
<stdlib.h>
  
int GCD(int m,int n);
  
/*function is to find the greatest common divisor between mand n*/
  
int main (int argc, char **argv)
  {    
      
int m,n,temp;
      printf(
"Please input m and n:\n"); 
      scanf(
"%d %d",&m,&n);    
      
if(m<n)
      {
/*This is just ensure m>n*/
           temp
=m;
           m
=n;
           n
=temp;  
      }
      printf(
"The greatest common divisor of (%d,%d) is  %d!\n",m,n,GCD(m,n));           
      system(
"PAUSE");
      
return 0;
  }
  
  
int GCD(int m,int n)
  {
      
if(m%n==0)
           
return n;
      
else return GCD(n,m%n); 
  } 

【问题描述】自然数的拆分:任何一个大于1的自然数N,总可以拆分成若干个自然数之和,并且有多种拆分方法。例如自然数5,可以有如下一些拆分方法:
5=1+1+1+1+1
5=1+1+1+2
5=1+2+2
5=1+4
5=2+3
void backtrack(int n,int k,int m)
{
    
int i;
    
if(n<0)
        
return ;
    
for(i=k;i<=n;i++)
    {
        add[m]
=i;
            rest
=n-i;
            
            
if(rest==0&&m>1)
            {
                
for(int j=1;j<=m;j++)
                    printf(
"%d ",add[j]);
                printf(
"\n");
            }
            
else
                backtrack(rest,i,m
+1);            
    }
}

8 八皇后问题的非递归
bool place_queen(int x[],int k)
{
    
int i;
    
for(i=1;i<k;i++)
    {
        
if((x[i]==x[k]) || (abs(x[i]-x[k])==abs(i-k)))
            
return false;
    }

    
return true;
}
int n_queens(FILE *fp,int n,int x[])
{
    
int nCount=0;    //解个数
    int k=1;        //先处理第1个皇后
    x[1]=0;

    
while(k>0)
    {
        x[k]
=x[k]+1;//在当前列加1的位置开始搜索

        
while(x[k]<=&& !place_queen(x,k))    //当前列位置是否满足条件
            x[k]=x[k]+1;    //不满足,继续搜索下一列位置

        
if(x[k]<=n)    //若存在满足条件的列
        {
            
if(k==n)//是最后一个皇后,则得到一个最终解
            {
                
//break;    //此处若break,则只能得到一个解
                nCount++;
                output_queens(x,n);    
//输出
                output_queens(fp,nCount,x,n);
            }
            
else    //否则,处理下一个皇后,即第 k+1 个皇后
            {
                k
++;
                x[k]
=0;
            }
        }
        
else        //若不存在满足条件的列,则回溯
        {
            x[k]
=0;    //第k个皇后复位为0
            k--;    //回溯到前一个皇后
        }
    }

    
return nCount;
}
 

 质因素分解问题

比如 100=2*2*5*5

void main()
{
    
    
int m=100;
    
int n=2;
    
int k=0;
    
int a[10],i=0;
    
while(m>=n)
    {
        
while(m%n!=0) n++;
        a[i
++]=n;
        m
=m/n;
    }
    
//printf("%d",i);

    
while(k<i)
    {
        printf(
"%d ",a[k]);
        k
++;
    }
    system(
"pause");

} 




 posted on 2009-07-24 10:16  清水湾  阅读(210)  评论(0)    收藏  举报