C语言复习1

来源:互联网 发布:mysql ibata文件 编辑:程序博客网 时间:2024/05/16 12:11

一、数字分解与合并
1、整数的分解与合并
 int i,j,k =5402;
 int a[6];
 int x=k;   //把k传给x,保证了k值不被修改。
 for(i=0;x>0;i++){
  a[i]=x%10;
  x/=10;
 }
 for(j=i-10;j>=0;j--)
   printf("%d ",a[j]);
  printf("\n");
 for(j=i-1,k=0;j>=0;j--){
  k*=10;
  k+=a[j];
 }
 printf("k=%d\n",k);


2、实数的小数部分分解与合并
 double f=9403.7023;
 int i,j, k=(int)f;
 int a[10] = {0};
 double d=f-k;  //获得小数部分:先取整, 再用原来的数-整数 = 小数
 for(i=0;d>fabs(10e-5);i++){   // d>fabs(10e-5):代表d的精度0.000000
  d*=10;
  a[i] = (int)d; //取得整数
     d -= a[i];  //减去整数,这里i多加了一个,所以j=i-1,而不是直接 j=i
 }
 for(j=0;j<i;j++)
  printf("%d ",a[j]);
  printf("\n");
 for(j=i-1,d=0;j>=0;j--){
   d/=10;
   d+=a[j];
  }
 printf("%0.6lf\n",d/10);
二、数制转换

 char ch[17]="0123456789ABCDEF";
 char a[64];
 int n,m,i,j;
 scanf("%d%d",&n,&m);
 for(i=0;n!=0;i++){
  a[i] = ch[n%m];
  n /= m;
 }
 a[i]='\0';
 for(j=i-1;j>=0;j--)
  printf("%c",a[j]); //按照原来的顺序输出:  从高-->低
 printf("\n");
三、括号匹配
 char c,a[10];
 int i=0;
 c=getchar();
 while(c!='\n'){
  if(c=='(')
   a[i++]=c;
  else if(c==')'){
    i--;
  if(i<=-1)
   break;
 }
  c=getchar();
 }
 if(i!=0)
   printf("括号匹配失败!\n");
 else
  printf("括号匹配成功!\n");


四、回文串
//方法1(for循环):
 char ch[20]="abcba";
 int i,j;
 for(i=0,j=strlen(ch)-1;i<j;i++,j--)  //j:指向最后一位    i:指向第一位  i++,j-- 向中间靠拢
 {
  if(ch[i]!=ch[j])
    break;
 }
 if(i<j)
   printf("不是回文串!\n");
 else
  printf("是回文串!\n");
//方法2(递归):
int fun(char *ch,int len,int index=0){  //这里用了C++的特性默认参数
  --len;  //在调用时如果len已经-1那这句就去掉是
  if(index>len)return 1;
  if(ch[index]!=ch[len])
 return 0;
  else
    return fun(ch,len-1,index+1);
}

五、首尾交换
 int k;
 int i,j;
 char a[20],t;
 gets(a);
 for(i=0,j=strlen(a)-1 ; i<j  ; i++,j--){
  t=a[i];
  a[i]=a[j];
 a[j]=t;
 }
 printf("%s\n",a);
 for(k=0; k<(int)strlen(a); k++)
 {
  printf("%c",a[k]);
 }
六、二分查找
//方法1(while循环):
 int low=0,hig=8,mid,key=3;
 int a[]={1,2,3,4,5,6,7,8,9};//前提是a[]已经从   小-->大  排序
 while(low<hig){
  mid=(low+hig)/2;
  if(a[mid]>key)
   hig=mid-1;
 else if(a[mid]<key)
   low=mid+1;
  else 
   printf("a[%d]=%d \n",mid,a[mid]);
 }
//方法2(递归):
 int fun(int *a,int key,int hig,int low=0){   //返回元素的下标
 int mid = (low+hig)/2;
    if(low > hig)
  return 0;
 if(a[mid] == key)
  return mid;
 else if(a[mid] < key)
  return fun(a,key,hig,mid+1);
 else if(a[mid] > key)
  return fun(a,key,mid-1,low);
}
void main(){
 
 int a = 123456789;
 fun(a,3,strlen(sizeof(a)),0);

 

???? 七、最大公约数  
int fun()
{
 int i,m=28,n=12;
 for(i=(m>n?n:m);i>0;i-=(m>n?n:m))
  if((m>n?m:n)%i==0)
   break;
 return i;
}

void main()
{
 printf("i=%d\n",fun());
}
八、最小公倍数s
 int fun()
 {
 int i,m=28,n=12;
 for(i=(m>n?m:n);i<m*n;i+=(m>n?m:n))
  if(i%(m>n?n:m)==0)
   break;
 return i;
 }

void main()
 {
 printf("i=%d\n",fun());
 }
九、欧几里德算法
while(r = m%n){
 m=n;
        n=r;
}
算法:
1、求余数:以n除m,并令r为所得余数(0<=r<=n)。
2、余数为0否?:若r=0算法结束,n即为答案。
3、减小:置m=n,n=r;并返回到步骤1.
证明:
{m,n}{n,r}
a.在步骤1后,对某个整数q, 我们有m=qn+r;
b.如果r=0;则m是n的倍数;n是m和n的最大因子;
c.如果r!=0;注意整除m和n的任何数必定整除m-qn=r;
d.因此整除n和r的任何数也必定整除qn+r=m;
e.所以{m,n}的公因子集合和{n,r}的公因子集合是一样的;
f.特别地,它们的最大因子是一样的。
求对大公约数的递归算法:
int fun(int n,int m){
 //保证 m>n 成立
 if(m<n){
  int temp = m;
  m=n;
  n=temp;
 }
 //int r=(m>n?m:n)%(m>n?n:m);
 int r=m%n;
 if(r==0)
  return n;
 else
  return fun(r,n);
 }
void main()
{
 printf("%d\n",fun(24,6));
}
十、百马驮百货:有100只马和100担货,大马驮3担,中马驮2担,小马驮1担,问100只马驮完100担货,大马、中马、小马各驮几只?
void main(){
 int i,j,k;
 for(i=0;i<33;i++)
  for(j=0;j<55;j++)
   if(i*3+j*2+100-i-j==100)
    printf("i=%d,j=%d,k=%d\n",i,j,100-i-j);
}
十一、百元买百鸡,100块钱买100只鸡。母鸡5块钱1只,公鸡3块钱1只,小鸡1块钱3只。
for(int i=0;i<20;i++)
  for(int j=0;j<33;j++)
    if(i*5+j*3+(double)(100-i-j)/3==100.0)
      printf("母鸡%d只,公鸡%d只,小鸡%d只\n",i,j,100-i-j);
十二、最小自然数:产生一个个位为6的整数(i=16,我们这里使用试探法,所以会有一个if() 然后break; ),并且这个数的个移到其余位之前,使得这个数是原来个位为6的整数的4倍。
void main()
{
 //printf("hello word!\n");
 long int i,n;
 int m;
 for(i=16; ;i+=10){
  n=i;//用n来替代i的值,保证i值不变。
  m=6;
  while(n>=10){
   m *= 10;
   n /= 10;  //n:除个位数之外的整数
  }
  if((m+i/10)==(4*i)){
   printf("%d\n",i);
   break;
  }
 }
}
十三、组合:n个球中取m个球,有几种取法?
/*
n个球中取m个球,的组合?C(n,m)=C(n-1,m)+C(n-1,m-1)
*/

int fun(int n,int m){
 if(n==0||m==0)
  return 0;
 if(n==0||m==0) return 1;
 if(m==n) return 1;
 else{
  return fun(n-1,m) + fun(n-1,m-1);
 }
 
}
void main()
{
 printf("%d\n",fun(12,8));

}
十四、把相邻重复的字符去掉
void main()
{
 char *p="aaabbbcccdddeeefff";
 char buff[100];
 char *q = p;     //指针q指向p的首地址
 int i=0;
 puts(p);
 while(*q){
  if(p==q || *q != *(q-1))
   buff[i++] = *q;
  q++;
 }
 //上面多加了一个i
 buff[i]='\0'; //在末尾加上'\0'
 puts(buff);
 
}
十五、输出数组中第m大的数,数组各个元素互不相等。
#include <stdio.h>
int main(){
  int i,j,k,m,n,a[]={9,8,7,6,5,4,3,2,1,0},b[10]={0};
  scanf("%d",&m);
  n=sizeof(a)/sizeof(int);
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      if(i!=j && a[i]<a[j])
        b[i]++;
    }
    if(b[i]==m-1)
      k=i;
  }
  printf("a[%d]=%d\n",k,a[k]);
  return 0;
}