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语言经典算法题的主要内容,如果未能解决你的问题,请参考以下文章