C语言经典算法题

Posted aiguangyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言经典算法题相关的知识,希望对你有一定的参考价值。

1. 有1、2、3、4个数字,能组成多少个互不相同且无重复的三位数?分别是多少?

#include <stdio.h>
int main(){
  int i,j,k;
  printf("\\n");
  for(i=1;i<5;i++){
    for(j=1;j<5;j++){
      for(k=1;k<5;k++){
        if(i!=j&&j!=k&&i!=k){
          printf("%d,%d,%d",i,j,k);
          printf("\\n");
        }
      }
    }
  };
  return 0;
}

2. 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

#include "math.h"
#include "stdio.h"

int main(){
  long int i,a,b,x,y;
  for(i=1;i<100000;i++){
    a = i+100;
    b = i+168;
    // 注意转换类型,否则报错
    x = sqrt((float)a);
    y = sqrt((float)b);
    if(x*x ==a && y*y==b){
      printf("\\n%ld\\n",i);
    }
  };
  return 0;
}

3. 企业发放的奖金根据利润提成。利润低于或等于10万元时按10%提成;利润在10万到20万之间的部分按7.5%提成;利润在20万到40万之间的部分按5%提成;利润在40万到60万之间的部分按3%提成;利润在60万到100万之间的部分按1.5%提成;高于100万的部分按1%提成。从键盘输入当月利润,求应发放奖金总数?

#include "stdio.h"

int main(){
  int bonus;
  int bonus1 = 100000*0.1;
  int bonus2 = bonus1 + (200000-100000)*0.75;
  int bonus4 = bonus2 + (400000-200000)*0.5;
  int bonus6 = bonus4 + (600000-400000)*0.3;
  int bonus10 = bonus6 +(1000000-600000)*0.15;

  long int i;
  scanf("%ld",&i);
  if(i<=100000){
    bonus = i*0.1;
  }else if(i<=200000){
    bonus = bonus1+(i-100000)*0.075;
  }else if(i<=400000){
    bonus = bonus2+(i-200000)*0.005;
  }else if(i<=600000){
    bonus = bonus4+(i-400000)*0.003;
  }else if(i<=1000000){
    bonus = bonus6+(i-600000)*0.015;
  }else{
    bonus = bonus10+(i-1000000)*0.01;
  };
  printf("bonus=%d",bonus);

  return 0;
}

4. 输入某年某月某日,判断这一天是这一年的第几天?

#include "stdio.h"

int main(){
  int year ,month,day,sum;
  printf("\\n 请输入年月日 \\n");
  scanf("%d,%d,%d",&year,&month,&day);
  switch(month){
    case 1:sum=0;break;
    case 2:sum=31;break;
    case 3:sum=31+28;break;
    case 4:sum=31+28+31;break;
    case 5:sum=31+28+31+30;break;
    case 6:sum=31+28+31+30+31;break;
    case 7:sum=31+28+31+30+31+30;break;
    case 8:sum=31+28+31+30+31+30+31;break;
    case 9:sum=31+28+31+30+31+30+31+31;break;
    case 10:sum=31+28+31+30+31+30+31+31+30;break;
    case 11:sum=31+28+31+30+31+30+31+31+30+31;break;
    case 12:sum=31+28+31+30+31+30+31+31+30+31+30;break;
    default:printf("input error");break;
  };
  sum = sum+day;
  if(year%400==0 || (year%4==0&&year%100!=0)){
    if(month>2){
      sum++;
    };
  };
  printf("当前是第%d天",sum);
  return 0;
}

5. 输入三个整数,把这三个数由小到大输出。

#include "stdio.h"
int main() {
  int x,y,z,t;
  scanf("%d%d%d",&x,&y,&z);
  if(x>y){
    t=x;x=y;y=t;
  };
  if(x>z){
    t=x;x=z;z=x;
  };
  if(y>z){
    t=y;y=z;z=t;
  };
  printf("small to big:%d,%d,%d",x,y,z);
  return 0;
}

6. 输出九九乘法口决表。

#include "stdio.h"
int main() {
  int i,j,result;
  for(i=1;i<10;i++){
    for(j=1;j<=i;j++){
      result = i*j;
      printf("%d*%d=%-3d",i,j,result);
    };
    printf("\\n");
  }
  return 0;
}

8. 输出国际象棋棋盘。

#include "stdio.h"
int main() {
  int i,j;
  for(i=0;i<8;i++){
    for(j=0;j<8;j++){
      if((i+j)%2==0){
        printf("❤️");
      }else{
        printf(" ");
      };
    };
    printf("\\n");
  }
  return 0;
}

9. 古典问题:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数是多少?

分析:前两个数之和为第三个数的值,即有名的斐波那契数列。

#include "stdio.h"
int main(){
  int i;
  long f1, f2;
  f1 = f2 = 1;
  for (i = 1; i < 20; i++){
    printf("%12ld%12ld", f1, f2);
    // 每行4个,然后换行
    if(i%2==0){
      printf("\\n");
    };
    f1=f1+f2;
    f2=f1+f2;
  }
  return 0;
}

10. 判断101到200之间有多少个素数,并输出所有素数。

分析:判断素数的方法,用一个数分别去除2到这个数的开平方,如果能被整除,则表明此数不是素数,反之是素数。

#include "stdio.h"
#include "math.h"

int main(){
  int m,i,k,h=0,leap=1;
  for(m=101;m<=200;m++){
    k = sqrt(m+1);
    // 判断是否是素数
    for(i=2;i<k;i++){
      if(m%i==0){
        leap = 0;
        break;
      }
    };
    // 此数是素数
    if(leap){
      printf("%-4d",m);
      h++;
    };
    // 还原开关
    leap=1;
  };
  printf("素数一共有%d:",h);
  return 0;
}

11. 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153等于1的三次方加上5的三次方加上3的三次方。

#include "stdio.h"
int main(){
  int i,j,k,n;
  for(n=100;n<1000;n++){
    // 分解出百位数
    i = n/100;
    // 分解出十位数
    j = n/10%10;
    // 分解出个位数
    k = n%10;
    if((i*100+j*10+k)==(i*i*i+j*j*j+k*k*k)){
      printf("%-5d",n);
    }
  }
  return 0;
}

12. 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

分析:对n进行分解质因数,应先找到最小的质数k,然后按下步骤执行:

(1). 如果这个质数等于n,则说明分解质数的过程已经结束,打印出即可;

(2). 如果n不等于k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步;

(3). 如果n不能被k整除,则用k+1作为新的k值,重复执行第一步。

#include "stdio.h"
int main(){
  int n,i;
  scanf("%d",&n);
  printf("%d=",n);
  for(i=2;i<n;i++){
    while (n!=i){
      if(n%i==0){
        printf("%d*",i);
        n=n/i;
      }else{
        break;
      }
    }
  }
  printf("%d\\n",n);
  return 0;
}

13. 输入两个正整数m和n,求其最大公约数和最小公倍数。

#include "stdio.h"
int main(){
  int n,m,temp;
  int p,r;

  printf("please input tow number\\n");
  scanf("%d,%d", &n,&m);

  // 把大数放在n中,把小数放在m中.
  if(n<m){
    temp = n;
    n = m;
    m = temp;
  };

  p=n*m;

  // 欧几里德算法
  // 100 模 60 余 40
  // 60 模 40 余 20
  // 40 模 20 余0
  // 20 即为最大公约数
  while (m!=0){
    r = n%m;
    n = m;     
    m = r; 
  };

  printf("最大公约数是%d\\n",n);
  // 两数乘积除以最大公约数即为最小公倍数
  printf("最小公倍数是%d\\n",p/n);

  return 0;
}

14. 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

分析:利用while语句,条件为输入的字符不为'\\n'。

#include "stdio.h"
int main(){
  char c;
  int letters=0,space=0,digit=0,others=0;
  printf("please input some words:\\n");
  while ((c=getchar())!='\\n'){
    // 字符
    if(c>='a'&&c<='z'|| c>='A'&& c<='Z'){
      letters++;
    // 空格
    }else if(c==32){
      space++;
    // 数字
    }else if(c>='0' && c<='9'){
      digit++;
    // 其它
    }else{
      others++;
    }
  };
  printf("char=%d space=%d,digit=%d,others=%d",letters,space,digit,others);
  return 0;
}

15. a+aa+aaa+aaaa+a...a的值,其中a是一个数字,几个数相加由键盘来控制。

#include "stdio.h"
int main(){

  int a,n,count=1;
  long int sn=0,tn=0;
  printf("please input a and n\\n");
  scanf("%d,%d",&a,&n);
  printf("a=%d,n=%d",a,n);

  // n 为位数
  while (count<=n){
    tn = tn+a;   // 0+2,2+20,22+200
    sn = sn+tn;  // 0+2,2+22,2+222+222
    a= a*10;     // 2*10,20*10,200*10
    ++count;
  };
  printf("result is %ld\\n",sn);
  return 0;
}

16. 一个数恰好等于它的因子之和,这个数就是一个“完数”。例如6=1+2+3,编程求出1000以内的所有完数。

#include "stdio.h"
int main(){
  int m,i,s;
  for(m=1;m<=10000;m++){
    s=0;
    // 求出该数的因子之和
    for(i=1;i<m;i++){
      if(m%i==0){
        s=s+i;
      }
    };
    // 因子数等于当前数
    if(s==m){
      printf("%d\\n",m);
    }
  }
  return 0;
}

17. 一球从100米高度自由落下,每次落地反跳回原高度的一半,再落下,求它在第10次落地时,共经过多少米?第10次反弹多高。

#include "stdio.h"

int main(){
  float total = 100.0, harf = total / 2;
  for (int n = 2; n <= 10; n++){
    total = total + 2 * harf;
    harf = harf / 2;
  };
  printf("第10次落地时共经过米数为%f\\n",total);
  printf("第10次反弹高度为%f\\n",harf);
  return 0;
}

18. 猴子吃桃问题:猴子第一天吃下若干个桃子,当即吃下一半,还不过瘾,又多吃了一个,第二天又将剩下的桃子吃了一半,又多吃了一个,以后每天都吃前一天剩下的一半零一个,到第10天想早上再吃时,只剩下一个桃子了。求第一天一共摘了多少个桃子?

#include "stdio.h"

int main(){
  int day,x1,x2;
  // 第9天吃完只剩一个桃了
  day=9;x2=1;
  while (day>0){
    // 第一天的桃子数是第二天的桃子数加1的2倍
    x1=(x2+1)*2;
    x2=x1;
    day--;
  };
  printf("第10天一共摘了%d",x2);
  return 0;
}

19. 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,已队为x,y,z三人,由抽签决定比赛。有人向队员打听比赛的的名单。a说他不和x比,c说他不和y,z比,请编程序找出三队赛手的名单。

#include "stdio.h"
int main(){
  // i是a的对手,j是b的对手,k是c的对手
  char i,j,k;
  for(i='x';i<='z';i++){
    for(j='x';j<='z';j++){
      if(i!=j){
        for(k='x';k<='z';k++){
          if(i!=k && j!=k){
            if(i!='x' && k!='x' && k!='z'){
              printf("a--%c\\tb--%c\\tc--%c\\n",i,j,k);
              // a--z b--x c--y
            }
          }
        }
      }
    }
  }
  return 0;
}

以上是关于C语言经典算法题的主要内容,如果未能解决你的问题,请参考以下文章

经典C语言面试算法题

C语言经典算法题

C语言经典编程题(上)

C语言经典算法题

有啥经典的c语言算法书推荐一下吗

有哪位大虾帮忙做下我的C语言的题阿