#include<stdio.h>
#include<math.h>
int main(){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a){
double s=(a+b+c)/2;
double area=sqrt(s*(s-a)*(s-b)*(s-c));
int peri=a+b+c;
printf("area=%f,perimeter=%d\n",area,peri);
}else
printf("these sides do not correspond to a valid triangle\n");
return 0;
}
实验3-9 三天打鱼两天晒网 (15分)
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
输入格式:
输入在一行中给出一个不超过1000的正整数N。
输出格式:
在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。
#include<stdio.h>
int main(){
int m;
scanf("%d",&m);
switch(m%5){
case(1):printf("fishing in day %d\n",m);break;
case(2):printf("fishing in day %d\n",m);break;
case(3):printf("fishing in day %d\n",m);break;
case(4):printf("drying in day %d\n",m);break;
case(5):printf("drying in day %d\n",m);break;
}
return 0;
}
按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
输入格式:
输入在一行中给出2个正整数,分别对应车速和限速,其间以空格分隔。
输出格式:
在一行中输出处理意见:若属于正常行驶,则输出“OK”;若应处罚款,则输出“Exceed x%. Ticket 200”;若应吊销驾驶证,则输出“Exceed x%. License Revoked”。其中x是超速的百分比,精确到整数。
#include<stdio.h>
int main(){
int speed,limit;
scanf("%d %d",&speed,&limit);
int x=100*(speed-limit)/limit;
if(x>=10 && x<50){
printf("Exceed %d%%.Ticket 200",x);
//后面两个百分号才表示%。
}else if(x>=50){
printf("Exceed %d%%.License Revoked",x);
}else
printf("OK");
return 0;
}
现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。
本题要求编写程序,根据输入顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助),计算并输出应付款。
输入格式:
输入在一行中给出两个整数和一个字符,分别表示顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助)。`
输出格式:
在一行中输出应付款额,保留小数点后2位。
int main(){
int a,b;
char c;
float pay;
scanf("%d %d %c",&a,&b,&c);
if(c=='m'){
if(b==90){
pay=a*6.95*0.95;
}else if(b==93){
pay=a*7.44*0.95;
}else if(b==97){
pay=a*7.93*0.95;
}
}else if(c=='e'){
if(b==90){
pay=a*6.95*0.97;
}else if(b==93){
pay=a*7.44*0.97;
}else if(b==97){
pay=a*7.93*0.97;
}
}
printf("%.2f",pay);
return 0;
}
实验4-1-1 最大公约数和最小公倍数 (15分)
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
最小公倍数=两数乘积/最大公约数
输入样例:
求最大公约数
辗转相除法
辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
例如,求(319,377):
∵ 319÷377=0(余319)
∴(319,377)=(377,319);
∵ 377÷319=1(余58)
∴(377,319)=(319,58);
∵ 319÷58=5(余29)
∴ (319,58)=(58,29);
∵ 58÷29=2(余0)
∴ (58,29)= 29;
∴ (319,377)=29。
可以写成右边的格式。
辗转相除法:
#include<stdio.h>
int main(){
int a,b,tmp,r;
scanf("%d %d",&a,&b);
int x=a;
int c=b;
if(a<b){
tmp=a;
a=b;
b=tmp;
}
while(b!=0){
r=a%b;
a=b;
b=r;
printf("%d %d %d\n",a,b,r);
}
printf("%d %d\n",a,x*c/a); //a和b最后的值都已经改变;
return 0;
}
另外一种简单的方法:
#include<stdio.h>
int main(){
int a,b,tmp,x;
scanf("%d %d",&a,&b);
if(a>b){
tmp=a;
a=b;
b=tmp;
}
int i=a;
for(i=a;i>=1;i--){
if(a%i==0&&b%i==0)
break;
}x=a*b/i;
printf("%d %d\n",i,x);
return 0;
}
实验4-1-2 求奇数和 (15分)
本题要求计算给定的一系列正整数中奇数的和。
输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式:
在一行中输出正整数序列中奇数的和。
输入样例:
#include<stdio.h>
int main(){
int a[10];
int i=0;
int sum=0;
for(i=0;i<10;i++){
scanf("%d",&a[i]);
if(a[i]>0){
if(a[i]%2==1)
sum+=a[i];
}else
break;
}
printf("%d\n",sum);
return 0;
}
实验4-1-3 找出最小值 (20分)
本题要求编写程序,找出给定一系列整数中的最小值。
输入格式:
输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。
输出格式:
在一行中按照“min = 最小值”的格式输出n个整数中的最小值。
输入样例:
#include<stdio.h>
int main(){
int n,a;
int min=0;
scanf("%d %d",&n,&a);
min=a;
for(int j=1;j<n;j++){
scanf("%d",&a); //可以循环读数
if(a<min)
min=a;
}
printf("min=%d",min);
return 0;
}
}
实验4-1-4 求整数的位数及各位数字之和 (15分)
对于给定的正整数N,求它的位数及其各位数字之和。
输入格式:
输入在一行中给出一个不超过10
9
的正整数N。
输出格式:
在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。
输入样例:
#include<stdio.h>
int main(){
int n;
int t;
int sum=0;
int cnt=1;
scanf("%d",&n);
int m=n;
while(m>9){ //计算出输入的数字一共几位
m/=10;
cnt++;
}printf("1)%d %d\n",cnt,m);
//cnt代表输出的数字位数,m最后是最高位上的数字;
while(cnt>1){
t=n%10;
n=(n-t)/10;
cnt--;
sum+=t;
printf("2)%d %d %d\n",cnt,t,sum);
}
sum=sum+m;
printf("3)%d\n",sum);
return 0;
}
另外一种简单的方法:
#include<stdio.h>
int main(){
int x;
int sum=0;
int cnt=0;
scanf("%d",&x);
while(x){
sum=sum+x%10;
x=x/10;
cnt++;
}
printf("%d %d\n",sum,cnt);
return 0;
}