算法基础(二)

/* 本文是本人练习《C语言编程实例》所作,有错误之处望指出,谢谢。*/


注意:
 
1. double 输入时要用 %lf 而并不是%f,否则会报错。
2. 圆周率的值可以 const double pi = acos(-1.0)
3. 在C程序中,整数取值没有四舍五入,直接去掉小数点后面的数字。
4. a||b 中,其一为真便为真,a&&b中,其一为假便为假。
5. 判断数据是否溢出,要看数据类型的字节位,例int为16bit,则取值范围是负2的16次方到正2的16次方。
6. 1byte = 8bits, 一个字节等于八个比特。
 


 


1-1 求圆柱的体积

#include<stdio.h>

#include<math.h>

int main()
{
      const double pi = acos(-1.0);
      double r, h, s1, s2, s;

      scanf("%lf%lf", &r, &h);

      s1 = pi*r*r;

      s2 = 2*pi*r*h;

      s = s1*2.0 + s2;

      printf("Area = %.3f\n", s);

      return 0;

}
 




1-2 数字的颠倒
 
法一:


#include<stdio.h>


void main()
{
int n,b,s,g;
scanf("%d",&n);
b = n/100;
s = n/10%10;
g = n%10;
 
printf("%d%d%d\n",g,s,b);

}


结构优化:


#include<stdio.h>


int main()
{
int n;
scanf("%d",&n);
printf("%d%d%d \n",n%10,n/10%10,n/100);
return 0;
}


程序优化:




#include<stdio.h>


void main()
{
int n,b,s,g;
scanf("%d",&n);
b = n/100;
s = n/10%10;
g = n%10;


if(g!=0)
printf("%d%d%d\n",g,s,b);
else
printf("%d%d\n",s,b);
}


法二:


#include<stdio.h>


void main()
{
int n,m;
scanf("%d",&n);
m = (n%10)*100 + (n/10%10)*10 + (n/100);
printf("%03d",m);
}


1-3 两个数交换位置
  
(The Bests)
#include<stdio.h>
int main()
{
  int a, b;
  scanf("%d %d",&a,&b);
  printf("%d %d\n",b,a);
  return 0;
}


#include<stdio.h>
int main()
{
int a,b,t;
scanf("%d %d",&a,&b);
t = a;
a = b;
b = t;
printf("%d %d\n",a,b);
return 0;
}


1-4 鸡兔同笼
  
#include<stdio.h> 
int main()
{
int j,t,n,m;
scanf("%d %d",&n,&m);
j = (4*n - m)/2;
t = n - j;

if(m%2==1 || j <0 || t<0 )
printf("No answer\n");
else 
printf("%d %d\n",j,t);
 
return 0;
 
} >
 


1-5 三数比较大小
 

法一:


#include<stdio.h>


int main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);


if(a<b && b<c) printf("%d %d %d\n",a,b,c); //两两比较大小,然后输出
else if(a<c && c<b) printf("%d %d %d\n",a,c,b);
else if(b<a && a<c) printf("%d %d %d\n",b,a,c);
else if(b<c && c<a) printf("%d %d %d\n",b,c,a);
else if(c<b && b<a) printf("%d %d %d\n",c,b,a);
else if(c<a && a<b) printf("%d %d %d\n",c,a,b);
return 0;
}
>


法二:
#include<stdio.h>


int main()
{
int a,b,c,t;
scanf("%d %d %d",&a,&b,&c);


if(a>b) {t=a; a=b; b=t;}
if(a>c) {t=a; a=c; c=t;}
if(b>c) {t=b; b=c; c=t;}
printf("%d %d %d\n",a,b,c);
return 0;
}



1-6 一整数加100是一个完全平方数,加168是一个完全平方数
 
#include<stdio.h>
#include<math.h>
int main()
{
int i,x,y;
for(i=1;i<10000;i++)
{
x = sqrt(i+100);
y = sqrt(i+168);
if(x*x == i+100 && y*y == i+168)
printf("%d\n",i);
}
return 0;





1-7 输入某年某月某日,判断这一天是这一年的第几天
#include<stdio.h>
int main()
{
int year,mouth,day,sum,leap;
printf("please input year,mouth,day\n");
scanf("%d %d %d",&year,&mouth,&day);
switch(mouth) //先计算月份天数
{
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"); break;


}


sum = sum+day;
if(year%400==0 ||(year%4 == 0 && year%100!=0)) //判断是不是闰年
leap=1;
else
leap=0;
if(leap==1&&mouth>2) //如果是闰年且月份大于2,总天数应该加一天
sum++;
printf("It is the %dth day.\n",sum);

return 0;


}


1-8 用*号输出字母C的图案


#include<stdio.h>
int main()
{
printf("show C:\n");
printf("   ****\n");
printf(" *    \n");
printf("*     \n");
printf("*     \n");
printf(" *    \n");
printf("   ****\n");


return 0;
}




1-9 输出特殊图形


#include<stdio.h>
void main()
{
char a=3;
char b=10;
printf("%c%c%c%c%c\n",b,a,a,a,b);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",a,a,b,a,a);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",b,a,a,a,b);
 
}



1-10 输出9*9口诀


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




1-11 要求输出国际象棋棋盘
#include<stdio.h>
void main()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if((i+j)%2==0)
printf("%c %c",1,2);
else
printf(" ");
printf("\n");
}
 
}


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


#include<stdio.h>


int main()
{
int f1,f2,f3,f4,i;
f4=0;
f1=f2=1;
f3 = f1+f2;
for(i=1;i<5;i++)
f4 += f3;
printf("the rabbit's number is: %d\n",f4);
}


12 1-13 判断101-200之间有多少个素数,并输出所有素数。


#include<stdio.h>
#include<math.h>
int main()
{
int m,n,k,leap=1,h=0;


for(m=101;m<=200;m++)
{
n = sqrt(m);
for(k=2;k<=n;k++)
if(m%k == 0)
{
leap=0;
break;
}
if(leap)
{
printf("%-4d",m);
h++;  //每输出一个数便加一个数
if(h%7 == 0)
printf("\n");
}
leap=1;
}
printf("\nThe total is %d\n",h);
return 0;
}


1-14 水仙花数,其各位数字立方和等于该数本身。
#include<stdio.h>
void main()
{
int g,s,b,n;


for(b=1;b<10;b++)
for(s=1;s<10;s++)
for(g=1;g<10;g++)
{
n=b*100+s*10+g;
if((g+s*10+b*100)==((b*b*b+g*g*g+s*s*s)))
printf("水仙花为:%d\n",n);
}
}


1-15 将一个正整数分解质因数。例如:90 = 2*3*3*5
#include<stdio.h>
void 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);

}


1-16 学习成绩>=90分的同学用A表示。60-89分之间的用B表示,
60分以下的用C表示
#include<stdio.h>
void main()
{
int score;
char grade;


scanf("%d",&score);
grade = score>=90?'A':(score>=60?'B':'C');


printf("%c\n",grade);
}




1-17 输入两个正整数m和n,求其最大公约数和最小公倍数。
#include<stdio.h>
void main()
{
int m, n,largest,i;


scanf("%d %d",&m,&n);

for(i=1;(i<m&&i<n);i++)
{
if(m%i == 0 && n%i ==0)
printf("%d",i);
else 
break;
}


}

猜你喜欢

转载自blog.csdn.net/Yuan_xln/article/details/79552833