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,所以我设了0和1
#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 ;
}