喜迎
春节

小甲鱼习题1-25选做


1.【程序1】1~4组成无重复数字的三位数

直接暴力枚举就好了
int main()
{
    //1-4组成无重复数字的三位数
    for(int i = 1 ; i <= 4 ; i++)
        for(int j = 1 ; j<= 4 ; j++)
            for(int z = 1 ; z <= 4 ;z++)
                if(i!=j && i!= z && z !=j)
                    printf("%d%d%d\n",i,j,z) ;

}

3.【程序3】加100是完全平方数

一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

完全平方数是指自己乘自己

刚开始没有做出来,是因为不了解完全平方数的概念

int main()
{
    for(int i = 0 ; i<=999999999; i++)
    {
        int x = sqrt(i+100) ;
        int y = sqrt(i+268) ;

        if(x*x == (i+100) && y*y == (i+268))
            printf("%d",i) ;
    }
}

4. 【程序4】年月日及年份的第几天判断

输入某年某月某日,判断这一天是这一年的第几天?

分别创建闰年和平年的每个月的天数。可以用bool函数来判断,需要加载库,因为c语言中之前是用0代表false,不为0的为true,所以我设了01
#include<stdbool.h>

int run_year(int year) ; // 声明函数
int main()
{
    //年月日第几天的判断
    int d[] = {0,31,28,31,30,31,30,31,31,30,31,30,31} ;  // 月份对应的天数
    int r_d[] = {0,31,29,31,30,31,30,31,31,30,31,30,31}  ;  // 闰年对应的天数

    int year,month,day ;
    int all_day = 0 ; // 是这一年的第几天
    //这样读取输入是有问题的,详情参考"笔记2.c的输入输出"
    scanf("%d%d%d",&year,&month,&day) ;   
//    scanf("%d",&year) ;
//    scanf("%d",&month) ;
//    scanf("%d",&day) ;
    if(run_year(year))  // 是闰年
    {
        for(int i = 0 ; i < month ; i++)  // 小于month,因为不能计算当月的天数
            all_day += r_d[i] ;

    }
    else
    {
        for(int i = 0 ; i< month; i++)
            all_day += d[i] ;
    }
    int res = all_day + day ;  //加上当月的天数
    printf("%d",res) ;  //是今年的第几天


}

int run_year(int year)
{
    if(year%400==0 || (year % 4 == 0 && year%100 != 0))
        return 1 ; // 是闰年
    else return 0 ; // 不是闰年
}
bool run_year(int year)
{
        if(year%400==0 || (year % 4 == 0 && year%100 != 0))
        return true ; // 是闰年
    else return false ; // 不是闰年
}

// 补充:后来发现c语言中也是有boolean类型的,需要导入stdbool.h,可以把判断闰年的函数更改为bool类型的

5.【程序5】三个数,从小到大输出


 // 转换值的类型,考查if else 
int main()
{
    int a , b , c , tmp ;  // 三个数
    scanf("%d%d%d",&a,&b,&c) ;
    if(a > b)
    {
        tmp = a ;
        a = b;
        b = tmp ;
    }
    if(a > c)
    {
        tmp = a ;
        a = c ;
        c = tmp ;
    }
    if(b > c)
    {
        tmp = c;
        c = b ;
        b = tmp ;
    }

    printf("%d %d %d",a,b,c) ;
}

8.【程序8】输出9*9口诀

 //for循环的嵌套
int main()
{
    for(int i = 1 ; i <= 9 ; i++)
    {

        for(int j = 1 ; j <= i ; j++)
        {

            printf("%d * %d = %d ",j,i,i*j) ;
        }
        printf("\n") ;
    }

}

11.【程序11】(古典问题)兔子问题

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

这题没有做出来,没看明白这种古典的描述,hhh,弄了半天是斐波那契数列,考验思维,把规律写出来就能看出是斐波那契数列了。可以定义斐波那契函数来做

第1个月,小兔子①没有繁殖能力,所以还是1对。
第2个月,小兔子①进入成熟期,仍然是1对。
第3个月,兔子①生了1对小兔子②,于是这个月共有2(1+1=2)对兔子。
第4个月,兔子①又生了1对小兔子③。因此共有3(1+2=3)对兔子。
第5个月,兔子①又生了1对小兔子④,而在第3个月出生的兔子②也生下了1对小兔子⑤。共有5(2+3=5)对兔子。
第6个月,兔子①②③各生下了1对小兔子。新生3对兔子加上原有的5对兔子这个月共有8(3+5=8)对兔子。

1,1,2,3,5,8,13,21,34..

int fib(int n )
{
    if(n ==1 || n==2) return 1 ;
    else return fib(n-1)+fib(n-2) ; 
}

int main()
{
    for(int i = 1 ; i <= 12 ; i++)
    {
        printf("第 %d 个月的兔子 总数为%d\n",i,fib(i)) ; 
     } 

}

12.【程序12】判断101到200之间的素数

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

idea : judge函数,判断是否为质数,这里进行了优化,将a开根,如果模i为0 ,说明不为素数,之后在枚举符合judge函数的输出就好了。求质数里,相比这种方法,还有两种速度更快的方法,欧拉筛和埃氏筛,其中欧拉筛最快。参考acwing算法笔记


bool judge(int a) ; //声明函数

bool judge(int a)
{
    if(a<=1) return false ;
    for(int i = 2 ; i <= a/i ; i++)
    {
        if(a % i == 0) return false ;
    }
    return true ;
}

int main()
{
    for(int i = 101 ; i <= 200 ; i++)
    {
        if(judge(i))
            printf("%d\n",i) ; 
    }
}

14.【程序14】将一个正整数分解质因数

将一个正整数分解质因数。例如:输入90,打印出90=2 3 3 *5

这一题用唯一分解定理就可以了,参考算法笔记,“数学思维与技巧-唯一分解定理模板”

这一题有个坑是什么呢,他让你打印的是所有的质因数,平常做题都是打印的质因数个数,所有while 和 if 的逻辑顺序要放好,谁在前谁在后,不然打印出来的结果可能是2,3,5,并不是两个3

当然还有其他的方法,可以定义一个判断是否为质数的函数,然后枚举出这个数的约数,同时又是质数的就可以了。

int main()
{
    int n ,cnt ;// 输入的一个正整数
    scanf("%d",&n) ;
    for(int i = 2 ; i <= n ; i ++)
    {
        while(n % i  ==0)
        {
            if(n % i == 0)
            {
                printf("%d\n" ,i);
            }
            n /= i;
        }

    }
}

15.【程序15】利用条件运算符的嵌套完成学习成绩的转换

利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示

// 语法题
int main()
{
    int n ; //表示成绩
    char grade ;
    scanf("%d",&n) ;
    grade = n>= 90 ?'A':
            n>=60 && n<=89 ? 'B':'C' ;
    printf("%c",grade) ;

}

16.【程序16】求最大公约数和最小公倍数

输入两个正整数m和n,求其最大公约数和最小公倍数。

这题可以利用枚举的方法,也可以用算法,分别是定义gcd,lcm,如果理解这两个函数的含义,还是很简单的,这里我分别用暴力的方法和定义这两个函数的方法来写

暴力法:
int main()
{
    int m , n ;  // 正整数
    scanf("%d%d",&m,&n) ;
    int res1 , res2 ; // 分别用来存储最大公约数和最小公倍数
    //因为不知道这两个数谁大谁小,所以我们要判断一下。
    int max , min ;
    if(m > n)
    {
        max = m ;
        min = n ;
    }
    else
    {
        max = n ;
        min = m ;
    }
    //最大公约数
    for(int i = min ; i >= 1 ; i--)
    {
        if(n % i == 0 && m % i ==0)
        {
            printf("最大公约数为:%d\n",i) ;
            break ;
        }
    }
    //最小公倍数
    for(int j = max ;; j++)
    {
        if(j % n == 0 && j % m == 0)
        {
            printf("最小公倍数为:%d\n",j);
            break ; 
        }
    }

}
辗转相除法
int gcd() ;
int lcm() ;

int main()
{
    int m , n ;  // 正整数
    scanf("%d%d",&m,&n) ;
    int res1 , res2 ; // 分别用来存储最大公约数和最小公倍数
    res1 = gcd(m,n) ;
    res2 = lcm(m,n) ;
    printf("最大公约数: %d\n",res1) ;
    printf("最小公倍数;%d",res2) ; 
}

int gcd(int a, int b )  // 求最大公约数 
{
    if(b==0) return a ;
    return gcd(b,a%b) ;
}

int lcm(int a , int b)  // 最小公倍数 
{
    return a * b / gcd(a,b) ;
 } 

19.【程序19】完数

一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3,编程找出1000以内的所有完数。

bool judge(int) ;

int main()
{
    for(int i = 1 ; i <= 1000; i++)
    {
        if(judge(i)) //如果是完数,输出
        {
            printf("%d\n",i) ;
        }

    }
}

bool judge(int n)  // 判断这个数是不是完数
{
    int res = 0; //这个数的因子之和
    for(int i = 1 ; i < n ; i ++)
    {
        if(n % i == 0) res+= i ;
    }
    if(res == n) return true ;
    else return false ;

}

20.【程序20】小球自由下落

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

这里有小坑,第一次自己设的是int型的,结果为0,后来发现25/2的时候已经是小数了,所以要设成浮点型的数。

还有这题问的是第10次落地时,共经过多少米,我这种写法除了第一次的100米,后面的都少算了一半,只算了弹起的高度,没有算落下的,所以应该乘2再减去开始的100。

第一次落地,落下100米,弹起50,再落下50, 共经过200米,所以在第二次落地时总经过200m

第二次落地,弹起25,落下25 。 第三次落地经过250

第三次落地,。。

int main()
{
    double res , H = 100 ;
    int n = 3 ;
    int cnt = n ; // 备份n
    while(n-- > 0)
    {
        res += H ;
        H = H/2 ;
    }
    double res1 = res*2 - 100;
    printf("第%d次落地时共经过%.2lf米\n第%d次弹起时反弹%.2lf米\n",cnt,res1,cnt,H) ; 
}

21.【程序21】猴子吃桃问题

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

bool judge(int) ;

int main()
{
    for(int i = 0 ; i <= 999999999; i++)
    {
        if(judge(i))
        {
            printf("%d",i) ;
            break ;
        }
    }
}

bool judge(int n)
{
    int tmp = 10 ;
    int have = n ; //现有的桃子数
    while(tmp-- > 0)
    {
        have = have /2 -1 ;
    }
    if(have == 1) return true ;
    else return false ;
}

25 程序25】求1+2!+3!+…+20!的和

int fac(int) ;  

// int res2 ;


int main()
{
    int res = 0 ; 
    for(int i = 1 ; i <= 20 ; i++)
    {
        res +=fac(i) ;
    }
    printf("%d",res) ;
}


int fac(int n)
{
    int res1 = 1;
    for(int i = 1; i <= n; i++)
    {
        res1 *=i ;
    }
    return res1 ;
}

文章作者: ljhaa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ljhaa !
评 论
 本篇
小甲鱼习题1-25选做
小甲鱼习题1-25选做
1.【程序1】1~4组成无重复数字的三位数直接暴力枚举就好了 int main() { //1-4组成无重复数字的三位数 for(int i = 1 ; i <= 4 ; i++) for(i
2023-05-02
下一篇 
编译流程
编译流程
C 语言的编译过程包括了预处理、编译、汇编和链接四个步骤,下面对这四个步骤进行详细解释。 1.预处理在编译之前,C 语言编译器需要先对源代码进行预处理。预处理器读取源代码并进行文本替换、条件编译等操作,生成一个经过预处理的源文件,例如: #
2023-05-02
  目录