前言:本人自2019年七月下旬确定了本科所在的大学及专业,便开始学习C语言。期间便是在PTA上做相关题集,然而碰到其中的却不曾有过详细记录在其他地方。如今临近期末,便借此整理本人的学习心得。
1 分支(if-else,switch)
if( )//1
if( ) //2
else//3
else//4
其中,3接的是2语句,那么,4接的便是1语句。
switch(n){
case 1:
break;
case 2:
break;
}
如上所示,若是n=1,那么进入的就是case 1。但若是其中没有break语句,则会进入下一条语句(case 2),以此类推。因此,case 后接break很重要。
2.关于scanf输入函数的一些问题:
int num;
char c;
char s[80];
scanf("%d",&num);
scanf("%c",&c);
scanf("%s",s);
如上所示,为什么在输入数字或者字符等后面要有地址符&,而输入字符串则不用?
因为num是整型变量名,因此scanf要取其变量内存中的地址;而s是char型数组,s本身指向这个数组的首地址。简而言之,num保存的是内容,s里保存的本身就是这个地址。
另:&表示的是取地址,数组后面若是没有[]表示的是首地址。
3.一些零散但是重要的知识点:
*p:取出地址对应的内容;
i++:先参与运算,再+1;
++i:先自加,再参与运算;
int a[n],pa=a;
a[i]=pa[i]=*(a+i)=*(pa+i);
如何将指针指向数组:
int a[10],i;
int* p;
p = a;
//*p指向了a这个数字,且*(p+i)等价于a[i];
知识点暂且写到这里,若是后面有想到则会继续补充。下面则是给出至今所碰到的重点题及解题技巧。
题1.
实验4-1-1-while和do-while 最大公约数和最小公倍数 (15分)
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
#include
int main(){
int a,b,t,p;
scanf("%d %d",&a,&b);
int x=a,y=b;
//辗转相除法
while(b!=0){
t=a%b;
a=b;
b=t;
}
//a为最大公约数
//最小公倍数等于两数之和处以最大公约数
p=x*y/a;
printf("%d %d",a,p);
return 0;
}
总结:
这题重点便是掌握其两点。1,求最大公约数的方法是辗转相除法。2,最小公倍数等于两个数的和除以最大公约数。求这两数在以后的许多题目都能见到,这些我会在以后提到。
题2.
实验4-1-4-while和do-while 求整数的位数及各位数字之和 (15分)
对于给定的正整数N,求它的位数及其各位数字之和。
输入格式:
输入在一行中给出一个不超过10
9
的正整数N。
输出格式:
在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。
输入样例:
321
输出样例:
3 6
#include
int main(){
int sum=0,n,b,a=0;
scanf("%d",&n);
while(n>0){
b=n%10;
n/=10;
sum+=b;
a++;
}
printf("%d %d",a,sum);
return 0;
}
以上这种算法为从个位数向前依次推进。下面,能看到这种求各位数的具体例子。
7-8 幸运彩票 (15分)
彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。
输入格式:
输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一张彩票的 6 位数字。
输出格式:
对每张彩票,如果它是幸运的,就在一行中输出 You are lucky!;否则输出 Wish you good luck.。
输入样例:
2
233008
123456
输出样例:
You are lucky!
Wish you good luck.
#include
int main() {
int a;
int n, i;
scanf("%d", &n);
for(i=1;i<=n;i++){
scanf("%d", &a);
if (a/100000+a/10000%10+a/1000%10==a%10+a/10%10+a/100%10) {
printf("You are lucky!\n");
}
else {
printf("Wish you good luck.\n");
}
}
return 0;
}
如上所示,在if语句的等式左端,所求的整数位次上的数字是从最高位依次往下走,而等式右端便是从最低位次往上走。
题3.斐波那契数列的不同求法及其实例
首先,通过一题简单的实例,我们能从中了解到什么为斐波那契数列:
实验4-1-10-while和do-while 兔子繁衍问题 (15分)
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:
30
输出样例:
9
#include
int main(){
int a=1,b=0,sum=1,n,m=1;
scanf("%d",&n);
if(n==1){
m=1;
}else{
do{
m++;
sum=a+b;
b=a;
a=sum;
}while(sum<n);
}
printf("%d",m);
return 0;
}
下面是用函数求斐波那契 函数接口定义: 裁判测试程序样例: int fib( int n ); int main() } 输入样例1: 还有用递归求其数字的方法,如下所示: f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。 函数接口定义: 裁判测试程序样例: int f( int n ); int main() } /* 你的代码将被嵌在这里 */
实验6-5 使用函数输出指定范围内的Fibonacci数 (20分)
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0
int fib( int n );
void PrintFN( int m, int n );
其中函数fib须返回第n项Fibonacci数;函数PrintFN要在一行中输出给定范围[m, n]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。
#include
void PrintFN( int m, int n );
{
int m, n, t;scanf("%d %d %d", &m, &n, &t);
printf("fib(%d) = %d\n", t, fib(t));
PrintFN(m, n);
return 0;
/* 你的代码将被嵌在这里 */
20 100 7
输出样例1:
fib(7) = 13
21 34 55 89
输入样例2:
2000 2500 8
输出样例2:
fib(8) = 21
No Fibonacci numberint fib(int n){
int i,a=1,b=0,sum=0;
sum=a+b;
if(n==1||n==2){
sum=1;
}else {
for(i=3;i<=n;i++){
b=a;
a=sum;
sum=a+b;
}
}
return sum;
}
void PrintFN( int m, int n ){
int cnt=0,i;
for(i=1;i<=20;i++){
if(fib(i)>=m&&fib(i)<=n){
if(cnt!=0)
printf(" ");
printf("%d",fib(i));
cnt++;
}
}
if(cnt==0){
printf("No Fibonacci number\n");
}
}
实验10-7 -递归函数 递归求Fabonacci数列 (10分)
本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:
int f( int n );
函数f应返回第n个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。
#include
{
int n;scanf("%d", &n);
printf("%d\n", f(n));
return 0;
输入样例:
6
输出样例:
8int f(int n) {
int sum;
if (n == 0) {
sum = 0;
}
else if (n == 1) {
sum = 1;
}
else {
sum = f(n - 2) + f(n - 1);
}
return sum;
}