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
#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);
}}
}
#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);
}
#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;
}
#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);
}
{ 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);
}
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);
}
#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);
}
7
【问题描述】自然数的拆分:任何一个大于1的自然数N,总可以拆分成若干个自然数之和,并且有多种拆分方法。例如自然数5,可以有如下一些拆分方法:
5=1+1+1+1+15=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);
}
}
{
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 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]<=n && !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;
}
{
int nCount=0; //解个数
int k=1; //先处理第1个皇后
x[1]=0;
while(k>0)
{
x[k]=x[k]+1;//在当前列加1的位置开始搜索
while(x[k]<=n && !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;
}
9 质因素分解问题
比如 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");
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
浙公网安备 33010602011771号