c语言经典编程实例100题
2017-08-22
题目
01题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
#include <stdio.h>
int main(){
int total = 0;
for (int b = 1; b < 5; b++)
{
for (int s = 1; s < 5; s++)
{
for (int g = 1; g < 5; g++)
{
if (b != s && s != g && b != g)
{
printf("%d\n",b*100+s*10+g);
total++;
}
}
}
}
printf("total = %d\n",total);
return 0;
}
02题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
分析:利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
#include <stdio.h>
int main()
{
long money;
scanf("%ld",&money);
int bounds1,bounds2,bounds4,bounds6,bounds10,bounds;
bounds1 = 100000 * 0.1;
bounds2 = bounds1 + 100000 * 0.075;
bounds4 = bounds2 + 200000 * 0.05;
bounds6 = bounds4 + 200000 * 0.03;
bounds10 = bounds6 +400000 * 0.015;
if (money <= 100000)
{
bounds = money * 0.1;
}else if(money <= 200000){
bounds = bounds1 + (money - 100000)*0.075;
}else if(money <= 400000){
bounds = bounds2 + (money - 200000)*0.05;
}else if(money <= 600000){
bounds = bounds4 + (money - 400000)*0.03;
}else if(money <= 1000000){
bounds = bounds6 + (money - 600000) * 0.015;
}else{
bounds = bounds10 + (money - 1000000) * 0.01;
}
printf("bounds=%d\n",bounds);
return 0;
}
03题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果
#include <stdio.h>
#include "math.h"
int main(){
long int i,x,y,z;
for (int i = 1; i < 100000; i++)
{
x = sqrt(i+100);
y = sqrt(i+268);
if (x*x == i + 100 && y*y==i+268)
{
printf("\n%d\n",i);
}
}
return 0;
}
04题目:输入某年某月某日,判断这一天是这一年的第几天?
分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天
#include <stdio.h>
int main(){
int year,month,day,sum,leap;
printf("\nplease input year\n");
scanf("%d",&year);
printf("\nplease inputmonth\n");
scanf("%d",&month);
printf("\nplease input day\n");
scanf("%d",&day);
switch(month){
case 1: sum = 0; break;
case 2: sum = 31; break;
case 3: sum = 59; break;
case 4: sum = 90; break;
case 5: sum = 120; break;
case 6: sum = 151; break;
case 7: sum = 181; break;
case 8: sum = 212; break;
case 9: sum = 243; break;
case 10: sum = 273; break;
case 11: sum = 304; break;
case 12: sum = 334; break;
default: printf("data error\n"); break;
}
sum = sum + day;
if (year%400==0 || (year%4==0 && year%100!=0)) // 判断是不是闰年
{
leap = 1;
}else{
leap = 0;
}
if (leap == 1 && month>2)
{
sum++;
}
printf("\n It is the %dth day.\n",sum );
}
05题目:输入三个整数x,y,z,请把这三个数由小到大输出
分析:们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
#include <stdio.h>
int main(){
int x,y,z,t;
printf("\nplease input x:");
scanf("%d",&x);
printf("\n please input y:");
scanf("%d",&y);
printf("\n please input z:");
scanf("%d",&z);
if(x > y){ // 交换x,y的值
t = x;
x = y;
y = t;
}
if(x > z){ // 交换x,z的值
t = x;
x = z;
z = t;
}
if(y > z){ // 交换y,z的值
t = y;
y = z;
z = t;
}
printf("small to big:%d %d %d\n",x,y,z);
return 0;
}
08题目:输出九九乘法表
#include <stdio.h>
int main(){
for(int i = 1;i<=9;i++){
for(int j = 1;j<=i;j++){
printf("%d x %d = %d",j,i,i*j);
printf(" ");
if(i==j){
printf("\n");
}
}
}
}
题目11:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
分析:兔子的规律数为 1,1,2,3,5,8,13…… 是一个典型的斐波那契数列, f(n) = f(n-1) + f(n-2)
#include <stdio.h>
// 非递归方式
void calcNumber()
{
long res1,res2;
res1 = res2 = 1;
for(int i = 1; i <= 20; i++){
printf("%12ld %21ld",res1,res2);
if (i%2 == 0) printf("\n");
res1 = res1 + res2;
res2 = res1 + res2;
}
}
// 递归方式
long getNumber(int month)
{
if (month == 1 || month == 2)
{
return 1;
}
return getNumber(month-1) + getNumber(month -2);
}
int main(){
for(int i = 1; i <= 40; i++){
printf(" %21ld",getNumber(i));
if (i%2 == 0) printf("\n");
}
}
题目12:判断101-200之间有多少个素数,并输出所有素数。
#include <stdio.h>
int main()
{
int count = 0;
for(int i=101;i<=200;i++)
{
int a = 1;
for (int j= 2; j < i/2; j++)
{
if(i%j == 0)
{
a = 0;
break;
}
}
if (a == 1)
{
count++;
printf("%d ", i);
if(count%5 ==0) printf("\n");
}
}
return 0;
}
题目13:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
#include <stdio.h>
int main(){
for(int i = 100;i <= 999; i++){
int ge = i%10;
int shi = (i%100)/10;
int bai = i/100;
if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i){
printf("%d ",i);
}
}
return 0;
}
题目14:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
。
#include <stdio.h>
int main(){
int num;
printf("\n please input a number:");
scanf("%d",&num);
printf("%d=",num);
for (int i =2;i<=num;i++)
{
while(num != i)
{
if(num%i == 0)
{
printf("%d*",i);
num = num/i;
}else{
break;
}
}
}
printf("%d", num);
return 0;
}
题目16:输入两个正整数m和n,求其最大公约数和最小公倍数
#include <stdio.h>
void calc(int a,int b)
{
printf("input : (%d,%d)",a,b);
if(b<a){
int temp = a;
a = b;
b = temp;
}
printf("use : (%d,%d)",a,b);
for(int i = a-1; i>=1;i--){
if(a%i == 0 && b%i == 0){
printf("\n(%d,%d)的最大公约数是:%d\n",a,b,i);
break;
}
}
int bei = b;
while(bei){
if(bei%a == 0 && bei%b == 0){
printf("\n(%d,%d)的最小公倍数是:%d\n",a,b,bei);
break;
}else{
bei++;
}
}
}
int main()
{
int a,b;
printf("\nplease input two nums:");
scanf("%d,%d",&a,&b);
if(a == b){
printf("\n最大公约数和最小公倍数是:%d\n",a);
}else{
calc(a,b);
}
return 0;
}