C程序练习
1.编程从键盘任意输入两个时间(例如4时55分和1时25分),计算并输出这两个时间之间的间隔。要求不输出时间差的负号。

#include<stdio.h> int main() { int hour1,minute1,hour2,minute2,hour3,minute3,time,time1,time2; printf("Input time one(hour, minute):"); scanf("%d,%d",&hour1,&minute1); printf("Input time two(hour, minute):"); scanf("%d,%d",&hour2,&minute2); time1=hour1*60+minute1; time2=hour2*60+minute2; if(time1>time2) time=time1-time2; else time=time2-time1; hour3=time/60; minute3=time%60; printf("%d hour %d minute\n",hour3,minute3); return 0; }
2.
设capital是最初的存款总额(即本金),rate是整存整取的存款年利率,n 是储蓄的年份,deposit是第n年年底账号里的存款总额。已知如下两种本利之和的计算方式:
-
按复利方式计息的本利之和计算公式为:deposit = capital * (1 + rate) n
-
按普通计息方式计算本利之和的公式为:deposit = capital * (1 + rate * n)
已知银行整存整取不同期限存款的年息利率分别为:
存期1年,利率为 0.0225
存期2年,利率为 0.0243
存期3年,利率为 0.0270
存期5年,利率为 0.0288
存期8年,利率为 0.0300
若输入其他年份,则输出"Error year!"

#include<stdio.h> #include<math.h> int main() { int flag=1; int year; double capital,rate,deposit; char interest; printf("Input capital, year:"); scanf("%lf,%d,&capital",&capital,&year); switch(year) { case 1:rate=0.0225; break; case 2:rate=0.0243; break; case 3:rate=0.0270; break; case 5:rate=0.0288; break; case 8:rate=0.0300; break; default:flag=0; } printf("Compound interest (Y/N)?"); scanf(" %c",&interest); if((interest=='y'||interest=='Y')&&flag) { deposit=capital*pow(1+rate,year); printf("rate = %.4f, deposit = %.4f\n",rate,deposit); } else if((interest=='n'||interest=='N')&&flag) { deposit=capital*(1+rate*year); printf("rate = %.4f, deposit = %.4f\n",rate,deposit); } else { printf("Error year!\n"); } return 0; }
3.
美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是一个4位数。我年龄的4次方是一个6位数。这=10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”请你编程算出他当时到底有多年轻。

#include <stdio.h> #include <stdlib.h> #include <math.h> int tenBit(int n,int *a); int main() { for(int x=10;x<=22;++x) { int a[10]={0,1,2,3,4,5,6,7,8,9}; int d = tenBit(x*x*x,a)+tenBit(x*x*x*x,a); if(d==10){ printf("age=%d\n",x); break; } } return 0; } int tenBit(int n,int *a){ int cnt =0; while(n){ for(int i=0;i<10;++i){ if(n%10==a[i]){ a[i]=-1; cnt++; } } n/=10; } return cnt; }
4.
化简分数的最简分数(寻找分子分母的最大公约数)

#include<stdio.h> int Gcd(int a,int b); int main() { int a; int b; printf("Input m,n:"); scanf("%d,%d",&a,&b); if (a<1||a>10000||b<1||b>10000) { printf("Input error!\n"); } else printf("%d/%d\n",a/Gcd(a,b),b/Gcd(a,b)); getchar(); getchar(); return 0; } int Gcd(int a,int b) { int max=1; int i; int n = a < b ? a : b; for (i = 1; i <= n; ++i) { if (a % i == 0 && b % i == 0 ) { if(max < i) { max = i; } } } return max; }
5.
从键盘任意输入一个整数n,编程计算并输出1~n之间的所有素数之和。
函数原型:int IsPrime(int x);
函数功能:判断x是否是素数,若函数返回0,则表示不是素数,若返回1,则代表是素数

#include<stdio.h> int IsPrime(int x); int main() { int x,i; int sum=0; printf("Input n:"); scanf("%d",&x); if(x<2) { printf("sum=%d\n",sum); } else { for(i=2;i<=x;i++) { if(!IsPrime(i)) { sum+=i; } } printf("sum=%d\n",sum); } getchar(); getchar(); return 0; } int IsPrime(int x) { int i; for (i=2;i<x;i++) { if(x%i==0) { return 1; break; } } return 0; }
6.
已知一个集合A,对A中任意两个不同的元素求和,若求得的和仍在A内,则称其为好数对。例如,集合A={1 2 3 4},1+2=3,1+3=4,则1,2和1,3 是两个好数对。编写程序求给定集合中好数对的个数。

#include<stdio.h> #define SIZE 1000 int Good(int a[], int m,int n); int main() { int i; int a[SIZE]; int n; int m=0; scanf("%d",&n); for (i=0;i<n;i++) { scanf("%d",&a[i]); } printf("%d",Good(a,m,n)); return 0; } int Good(int a[], int m,int n) { int i,j,k; for(i=0;i<n-1;++i) { for (j=i+1;j<n;j++) { for(k=0;k<n;k++) { if(a[i]+a[j]==a[k]) m++; } } } return m; }
7.
猴子吃桃问题,反向递归
法一:

#include<stdio.h> int Monkey(int n, int x); int main() { int n,x=1; printf("Input days n:"); scanf("%d",&n); printf("x=%d\n",Monkey(n,x)); } int Monkey(int n, int x) { if(n==1) { return x; } else { return Monkey((n-1),2*(x+1)); } }
法二:

#include <stdio.h> int getPeachNumber(n) { int num; //定义所剩桃子数 if(n==10) { return 1; //递归结束条件 } else { num =(getPeachNumber(n+1)+1)*2;//这里是不应该用递归呢? printf("第%d天所剩桃子%d个\n", n, num); //天数,所剩桃子个数 } return num; } int main() { int num = getPeachNumber(1); printf("猴子第一天摘了:%d个桃子。\n", num); return 0; }
8.
据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头。智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说: 从我开始报数(围成一圈),第5个人可以吃到馒头(并退下) ,按此方法,所有和尚都吃到了馒头,唯独鲁智深没有吃上。请问他在那个位置? 能否借鉴筛法求出剩下的最后一个人的位置?

#include <stdio.h> int main() { int a[100]={0}; int bread; int cnt=0;int i=0; for (bread=99; bread>0; ++i,i%=100) { if(a[i]==0) { cnt++; } if (cnt==5) { bread--; cnt=0; a[i]=-1;//改变已经分到的状态 } } for(i=0;i<100;i++) { if (a[i]==0) printf("The result is %d: ",i+1); } return 0; }
9.
Squeeze函数的功能是删除字符串s中所出现的与变量c相同的字符。例如,输入为:abcdef↙c↙输出为:abdef

#include <stdio.h> #include <string.h> void Squeeze(char *s, char c); int main() { char a[80], c, *s; s = a; gets(a); scanf("%c",&c); Squeeze(s, c); printf("%s\n", s); return 0; } void Squeeze(char *s, char c) { int i, j; for (i = j = 0; s[i] != '\0'; i++) { if (__________) { __________; j++; } } _____________; /* 在字符串t2的末尾添加字符串结束标志 */ }
10.
从键盘输入一串字符(假设字符数少于8个),以回车表示输入结束,编程将其中的数字部分转换为整型数并以整型的形式输出。
函数原型为 int Myatoi(char str[]);其中,形参数组str[]对应用户输入的字符串,函数返回值为转换后的整型数。
(str[i]-'0'); //将字符数字转化为相应的数字

#include<stdio.h> #include<string.h> #define LENGTH 8 int Myatoi(char str[]); int main() { char str[LENGTH+1]; printf("Input a string:"); scanf("%7s",str); printf("%d\n",Myatoi(str)); return 0; } int Myatoi(char str[]) { int i; int result=0; for(i=0;str[i]!='\0';i++) { if(str[i]>='0'&&str[i]<='9') { result=result*10+(str[i]-'0'); //将字符数字转化为相应的数字 } } return result; }
11.编程计算n(n<=500)以内的10个最大素数及其和,分别输出这最大的10个素数及其和。n的值要求从键盘输入。要求10个素数按从大到小的顺序输出。

#include<stdio.h> #include<math.h> int Isprime(int n); int main() { int i,n,cnt=0; int a[10]={0}; int sum=0; printf("Input n(n<=500):"); scanf("%d",&n); for (i=n;i>=2;--i) { if(Isprime(i)) { a[cnt]=Isprime(i); sum+=a[cnt]; printf("%6d",a[cnt]); if(cnt==9) break; cnt++;//严格注意位置 } } printf("\nsum=%d\n",sum); getchar(); getchar(); return 0; } int Isprime(int n) { int i,flag=1; for (i=2;i<=sqrt(n);i++) { if(n%i==0) { flag=0; break; } } if(flag==1) { return n; } else return 0; }
12.
题目内容:请输入星期几的第一个字母(不区分大小写)来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母(小写),否则输出“data error”。

#include<stdio.h> int main() { char i,j; printf("please input the first letter of someday:\n"); scanf("%c",&i); switch(i) { case 'M': case 'm': printf("monday\n"); break; case 'w': case 'W': printf("wednesday\n"); break; case 'f': case 'F': printf("friday\n"); break; case 't': case 'T': printf("please input second letter:\n"); scanf(" %c",&j); if (j=='u')//||j=='U') { printf("tuesday\n"); break; } else if (j=='h')//||j=='H') { printf("thursday\n"); break; } else printf("data error\n"); break; case 's': case 'S': printf("please input second letter:\n"); scanf(" %c",&j); if (j=='a')//||j=='A') { printf("saturday\n");break; } if (j=='u')//||j=='U') { printf("sunday\n"); break; } else printf("data error\n"); break; default : printf("data error\n"); break; } return 0; }
13.奖学金发放
题目内容:
某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,每项奖学金获取的条件分别如下:
1) 院士奖学金:期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生每人均可获得8000元;
2) 五四奖学金:期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生每人均可获得4000元;
3) 成绩优秀奖:期末平均成绩高于90分(>90)的学生每人均可获得2000元;
4) 西部奖学金:期末平均成绩高于85分(>85)的西部省份学生每人均可获得1000元;
5) 班级贡献奖:班级评议成绩高于80分(>80)的学生干部每人均可获得850元;
只要符合上述条件就可获得相应的奖项,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚明的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。

#include<stdio.h> typedef struct winners { char name[20]; int finalScore; int classScore; char work; char west; int paper; int scholarship; }WIN; void Addup(WIN stu[],int n); int FindMax(WIN student[],int n); int main() { int n; WIN stu[10]; printf("Input n:"); scanf("%d",&n); Addup(stu,n); FindMax(stu,n); printf("%s get the highest scholarship %d\n",stu[FindMax(stu,n)].name,stu[FindMax(stu,n)].scholarship); getchar(); getchar(); return 0; } void Addup(WIN stu[],int n) { int i; for (i=0;i<n;++i) { stu[i].scholarship=0; printf("Input name:"); scanf("%s",stu[i].name); printf("Input final score:"); scanf("%d",&stu[i].finalScore); printf("Input class score:"); scanf("%d",&stu[i].classScore); printf("Class cadre or not?(Y/N):"); scanf(" %c",&stu[i].work); printf("Students from the West or not?(Y/N):"); scanf(" %c",&stu[i].west); printf("Input the number of published papers:"); scanf("%d",&stu[i].paper); if(stu[i].finalScore>80&&stu[i].paper>0) { stu[i].scholarship+=8000; } if(stu[i].finalScore>85&&stu[i].classScore>80) { stu[i].scholarship+=4000; } if(stu[i].finalScore>90) { stu[i].scholarship+=2000; } if(stu[i].finalScore>85&&stu[i].west=='Y') { stu[i].scholarship+=1000; } if(stu[i].classScore>80&&stu[i].work=='Y') { stu[i].scholarship+=850; } printf( "name:%s,scholarship:%d\n",stu[i].name,stu[i].scholarship); } } int FindMax(WIN student[],int n) { int i,k=0; int max=student[k].scholarship; for (i=1;i<n;i++) { if(student[i].scholarship>max) { max=student[i].scholarship; k=i; } } return k; }
14.评选最牛群主
现在要评选最牛群主,已知有3名最牛群主的候选人(分别是tom,jack和rose),有不超过1000人参与投票,最后要通过投票评选出一名最牛群主,从键盘输入每位参与投票的人的投票结果,即其投票的候选人的名字,请你编程统计并输出每位候选人的得票数,以及得票数最多的候选人的名字。候选人的名字中间不允许出现空格,并且必须小写。若候选人名字输入错误,则按废票处理。

#include<stdio.h> #include<string.h> typedef struct { char name[10]; int m; }Vote; int main() { Vote a[3]; int j; for (j=0;j<3;j++) { a[j].m=0; } char *pName[]={"tom","jack","rose"}; int i,n; char str[10]; printf("Input the number of electorates:"); scanf("%d",&n); for (i=0;i<n;i++) { printf("Input vote %d:",i+1); scanf("%s",str); if(strcmp(str,pName[0])==0) { (a[0].m)++; } if(strcmp(str,pName[1])==0) { a[1].m++; } if(strcmp(str,pName[2])==0) { a[2].m++; } } printf("Election results:\n"); for (i=0;i<3;i++) { printf("%s:%d\n",pName[i],a[i].m); } int k=0; int max=a[k].m; for (i=1;i<3;i++) { if(max<a[i].m) { max=a[i].m; k=i; } } printf("%s wins\n",pName[k]); getchar(); getchar(); return 0; }