一、第一周
1 求最大公约数和最小公倍数
题目内容:
编写程序,在主函数中输入两个正整数 a,b,调用两个函数 fun1() 和 fun2(),分别求 a 和 b 的最大公约数和最小公倍数,在主函数中输出结果。
输入格式:
两个正整数
输出格式:
最大公约数和最小公倍数
输入样例:
12,40[回车]
输出样例:
最大公约数:4[回车]
最小公倍数:120[回车]
代码:
#include<stdio.h>
int fun1(int a,int b){
int min,max;
if(a<=b){
min=a;
max=b;
}
else{
min=b;
max=a;
}
for(int i=min;i>0;i--){
if((min%i==0)&&(max%i==0)){
return i;
}
}
}
int fun2(int a,int b){
int num;
return a*b/fun1(a,b);
}
int main(){
int a,b;
scanf("%d,%d",&a,&b);
printf("最大公约数:%d\n",fun1(a,b));
printf("最小公倍数:%d\n",fun2(a,b));
}
解释:
这段代码包含了两个函数fun1
和fun2
,以及main
函数。fun1
函数用于计算两个整数的最大公约数(Greatest Common Divisor, GCD),而fun2
函数用于计算两个整数的最小公倍数(Least Common Multiple, LCM)。最后,main
函数获取用户输入的两个整数,并调用这两个函数来输出它们的最大公约数和最小公倍数。
#include<stdio.h>
int fun1(int a,int b){
int min,max;
if(a<=b){
min=a;
max=b;
}
else{
min=b;
max=a;
}
for(int i=min;i>0;i--){
if((min%i==0)&&(max%i==0)){
return i;
}
}
}
fun1
函数接收两个整数a
和b
作为参数,并返回它们的最大公约数。首先,函数确定两个数中的最小值和最大值。然后,它从最小值开始向下遍历,直到找到能够同时整除这两个数的最大数,即最大公约数。
int fun2(int a,int b){
int num;
return a*b/fun1(a,b);
}
fun2
函数接收两个整数a
和b
作为参数,并返回它们的最小公倍数。它通过调用fun1
函数来获取a
和b
的最大公约数,然后使用公式a*b/GCD(a,b)
来计算最小公倍数,其中GCD(a,b)
是a
和b
的最大公约数。
int main(){
int a,b;
scanf("%d,%d",&a,&b);
printf("最大公约数:%d\n",fun1(a,b));
printf("最小公倍数:%d\n",fun2(a,b));
}
main
函数是程序的入口点。它首先通过scanf
函数读取用户输入的两个整数a
和b
,然后分别调用fun1
和fun2
函数来计算并打印这两个整数的最大公约数和最小公倍数。
需要注意的是,scanf
函数中的格式字符串"%d,%d"
期望输入时两个整数之间有一个逗号,
。如果用户输入时没有逗号,程序将无法正确读取两个整数。此外,fun1
函数在找到最大公约数后应该立即返回,而不是继续执行循环。在fun1
函数中,找到最大公约数后应该有一个break
语句来退出循环,以提高效率。
2 排序并插入
题目内容:
编写程序,在主函数中定义一个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出。
输入格式:
9个整数和1个整数
输出格式:
10个整数
输入样例:
2,3,1,5,6,76,89,31,90[回车]
7[回车]
输出样例:
1,2,3,5,6,7,31,76,89,90[回车]
代码:
#include <stdio.h>
void sort(int n[],int m)
{
int i,j,t;
for(i=0; i<9; i++)
{
for(j=0; j<= 8-i; j++)
{
if(n[j] > n[j+1])
{
t = n[j];
n[j] = n[j+1];
n[j+1] = t;
}
}
}
for(i=0; i<10; i++)
{
printf("%d",n[i]);
if(i<9) printf(",");
}
}
int main()
{
int j,i,n[10];
for(i=0; i<9; i++)
{
scanf("%d", &n[i]);
if(i<8) scanf(",");
}
scanf("%d",&n[9]);
sort(n,10);
return 0;
}
解释
这段代码的主要功能是读取10个整数,然后使用插入排序算法对它们进行排序,并按照逗号分隔的格式输出排序后的数字。
#include <stdio.h>
void sort(int n[], int m) {
int i, j, t;
for (i = 0; i < 9; i++) {
for (j = 0; j <= 8 - i; j++) {
if (n[j] > n[j + 1]) {
t = n[j];
n[j] = n[j + 1];
n[j + 1] = t;
}
}
}
for (i = 0; i < 10; i++) {
printf("%d", n[i]);
if (i < 9) printf(",");
}
}
sort
函数接收一个整数数组n
和数组的大小m
。它使用插入排序算法对数组进行排序。插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。排序完成后,函数会打印出排序后的数组,每个元素之间用逗号分隔。
int main() {
int j, i, n[10];
for (i = 0; i < 9; i++) {
scanf("%d", &n[i]);
if (i < 8) scanf(",");
}
scanf("%d", &n[9]);
sort(n, 10);
return 0;
}
main
函数是程序的入口点。它首先声明一个整型数组n
,大小为10。然后,它使用scanf
函数读取10个整数,存储在数组n
中。在读取前9个数字后,程序还会读取一个逗号。最后,调用sort
函数对数组进行排序,并打印排序后的结果。
二、第二周
1 最大公约数
题目内容:
输入两个整数m,n,用递归算法实现计算两个数的最大公约数。
输入格式:
输入两个整数m,n
输出格式:
最大公约数
输入样例:
12,40[回车]
输出样例:
4[回车]
代码
#include<stdio.h>
int fun1(int a,int b){
int c;
while(b!=0){
c=a%b;
a=b;
b=c;
}
return a;
}
int main(){
int a,b;
scanf("%d,%d",&a,&b);
printf("%d\n",fun1(a,b));
return 0;
}
解释
这段代码定义了一个名为fun1
的函数,该函数用于计算两个整数的最大公约数(Greatest Common Divisor, GCD),并在main
函数中调用fun1
来计算用户输入的两个整数的最大公约数。
#include<stdio.h>
int fun1(int a, int b){
int c;
while(b != 0){
c = a % b;
a = b;
b = c;
}
return a;
}
fun1
函数使用辗转相除法(也称欧几里得算法)来计算最大公约数。辗转相除法的基本思想是:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。在函数中,a
和b
的值在每次循环中被更新,直到b
变为0,此时a
的值就是两个数的最大公约数。
int main(){
int a, b;
scanf("%d,%d", &a, &b);
printf("%d\n", fun1(a, b));
return 0;
}
main
函数是程序的入口点。它首先声明两个整型变量a
和b
,然后使用scanf
函数读取用户输入的两个整数,这两个整数之间需要用逗号分隔。接着,调用fun1
函数计算这两个整数的最大公约数,并使用printf
函数输出结果。
2 奇数求和
题目内容:
用递归算法实现,输入整数n(n>0), 求1+3+5+7….+(2*n-1) 的和
输入格式:
输入整数n
输出格式:
输出和
输入样例:
5[回车]
输出样例:
25[回车]
代码
#include<stdio.h>
int main(){
int n,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
sum+=2*i-1 ;
}
printf("%d\n",sum);
}
解释
-
#include<stdio.h>
:这行代码包含了标准输入输出库stdio.h
,它提供了基本的输入输出功能,如scanf
和printf
。 -
int main()
:这是主函数,程序的入口点。 -
int n, sum=0;
:声明了两个整型变量n
和sum
,其中sum
初始化为0,用于存储奇数的和。 -
scanf("%d",&n);
:这行代码从用户那里读取一个整数n
。 -
for(int i=1; i<=n; i++)
:这是一个for循环,它从1开始,递增到n。 -
sum += 2*i - 1;
:这是循环体中的唯一语句,它计算当前循环次数i
对应的奇数(2i - 1),并将其加到sum
上。由于i从1开始,2i - 1总是奇数。 -
printf("%d\n",sum);
:循环结束后,这行代码输出计算得到的奇数和sum
。 -
return 0;
:表示程序正常退出。
三、第三周
1 巧算自然数
题目内容:
编程实现输入一个自然数,若为偶数,则把它除以2;若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。输出经过多少次可以得到自然数1和每次得到的值。
输入格式:
输入一个自然数
输出格式:
输出经过多少次可以得到自然数1和每次得到的值
输入样例:
22[回车]
输出样例:
22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1[回车]
step=16[回车]
代码:
#include<stdio.h>
void number(int n){
int step=0;
printf("%d",n);
while(n!=1){
if(n%2==0){
n=n/2;
}
else{
n=3*n+1;
}
step+=1;
printf(",%d",n);
}printf("\nstep=%d\n",step+1);
}
int main(){
int n,step;
scanf("%d",&n);
number(n);
}
解释:
这段代码实现了一个称为“Collatz 序列”(也称为“3n+1 猜想”或“奇偶归一猜想”)的数学问题。Collatz 序列的定义是:对于任何一个正整数n,如果n是偶数,则将其除以2;如果n是奇数,则将其变为3n+1。重复这个过程,最终所有数都会变为1。
-
#include<stdio.h>
:这行代码包含了标准输入输出库stdio.h
,它提供了基本的输入输出功能,如scanf
和printf
。 -
void number(int n)
:这是一个名为number
的函数,它接受一个整数n
作为参数,并打印出从n
开始的Collatz序列。 -
int step=0;
:在number
函数中,声明了一个整型变量step
,用于记录执行步骤数。 -
printf("%d",n);
:打印出当前的数值n
。 -
while(n!=1)
:这是一个while循环,它会一直执行,直到n
变为1。 -
if(n%2==0)
:判断n
是否为偶数。如果是,则执行n=n/2
。 -
else
:如果n
是奇数,则执行n=3*n+1
。 -
step+=1;
:每执行一次操作,step
就增加1。 -
printf(",%d",n);
:打印出经过一次操作后的新值n
。 -
printf("\nstep=%d\n",step+1);
:当循环结束时,打印出总共执行的步骤数。注意,这里打印的是step+1
,因为初始值n
也算一步。 -
int main()
:这是主函数,程序的入口点。 -
int n,step;
:声明了两个整型变量n
和step
。step
在这里并没有被使用,可以删除。 -
scanf("%d",&n);
:从用户那里读取一个整数n
。 -
number(n);
:调用number
函数,传入用户输入的整数n
。
2 卖鸭子
题目内容:
编程调用递归函数。一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了7个村子后还剩2只鸭子,问他出发时共赶多少只鸭子?经过每个村子时依次卖出多少只鸭子?
输入格式:
无
输出格式:
出发时总鸭子数
每个村子卖出鸭子数
输入样例:
无
输出样例:(不是结果,仅表示格式)
sum=25[回车]
sell=8,sell=4,[回车]
代码:
#include<stdio.h>
int circ(int);
int main()
{
int all, v, sum;
all = circ(7);
printf("sum=%d\n",all);
for(v = 0; v < 7; v++)
{
sum = all / 2 + 1;
printf("sell=%d,", sum);
all = all / 2 - 1;
}
printf("\n");
return 0;
}
int circ(int i)
{
if(i == 0)
{
return 2;
}
else
{
i = 2*( circ(i - 1) +1);
return i;
}
}
解释:
这段代码定义了一个名为circ
的递归函数,用于计算一个特定的数列中的第i
项的值。然后在main
函数中使用这个函数来计算一个剧场中座位的总数,并模拟座位销售的过程。
#include<stdio.h>
int circ(int);
int main()
{
int all, v, sum;
all = circ(7); // 调用circ函数计算第7项的值
printf("sum=%d\n",all); // 打印总座位数
for(v = 0; v < 7; v++) // 循环7次,模拟7天的销售过程
{
sum = all / 2 + 1; // 计算当天销售的座位数
printf("sell=%d,", sum); // 打印当天销售的座位数
all = all / 2 - 1; // 更新剩余的座位数
}
printf("\n");
return 0;
}
int circ(int i)
{
if(i == 0)
{
return 2; // 基本案,第0项的值为2
}
else
{
i = 2 * (circ(i - 1) + 1); // 递归计算第i项的值
return i;
}
}
-
#include<stdio.h>
:这行代码包含了标准输入输出库stdio.h
,它提供了基本的输入输出功能,如printf
。 -
int circ(int);
:这是circ
函数的声明,它接受一个整数i
作为参数,并返回一个整数。 -
int main()
:这是主函数,程序的入口点。 -
all = circ(7);
:调用circ
函数计算第7项的值,并将其存储在变量all
中。 -
printf(