学习内容: 算法入门
1、 鸡兔同笼问题
#include#include #include int main() { //鸡兔同笼 int a, b, n, m; scanf("%d%d", &n, &m); //m为偶数,a必为整数 a = (4*n-m)/2; b = n-a; if(m%2==1||a<0||b<0) printf("no answern"); else printf("%d %d",a,b); return 0; }
2、三数排序
#include#include int main() { //三整数排序 int a, b, c, t; scanf("%d%d%d", &a, &b, &c); if(a>b){ t = a; a = b; b = t; } if(a>c){ t = a; a = c; c = t; } if(b>c){ t = b; b = c; c = t; } printf("%d %d %d", a, b, c); return 0; }
3、输入三角形3条边的长度(均为正整数),判断能否称为三角形的三个边长。如果可以,判断是否为直角三角形
#includeint main(void) { //输入三角形3条边的长度(均为正整数),判断能否称为三角形的三个边长 //如果可以,判断是否为直角三角形 int a,b,c; scanf("%d%d%d",&a,&b,&c); if((a+b>c)&&(a+c>b)&&(b+c>a)) { //C语言没有乘方符号,但有乘方函数 //^的意思是二进制按位异或 if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a)) { printf("yes"); } else { printf("no"); } } else { printf("not a triangle"); } return 0; }
4、 闰年判断
#includeint main(void) { //闰年判断 int year; scanf("%d",&year); if((year%4!=0)||((year%100==0)&&(year%400!=0))) { printf("no"); } else { printf("yes"); } return 0; }
5、 关于数据类型的问题
(1)int 占4个字节,32位。最大值231-1,最小值-231。
(2)double型浮点数能精确到多少位小数?或者,这个问题本身值得商榷?
既然double是浮点数,它的小数点的位置是“浮动”的,所以很难说double类型能精确到小数点后面几位。通常这个关于精度的问题都是通过它能表示的有效数字(十进制)的位数来表示的。遵循IEEE标准的8字节(64位)的double能表示的有效数字的位数是:15 ~ 16。
参考链接:https://blog.csdn.net/weixin_42499332/article/details/114166781.
6、7744问题
#includeint main() { //完全平方数:若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。 //7744问题,枚举平方根避开平方操作 for(int x = 1;;x++){ int n = x*x; if(n<1000) continue; if(n>9999) break; int hi = n / 100; int lo = n%100; if((hi/10==hi%10)&&(lo/10==lo%10)){ printf("%d ",n); } } return 0; }
7、 3n+1问题
#includeint main() { //3n+1问题 //未避免输入输出格式符不同意,先将值读入int变量,再赋给long long 类型变量。 int n2, count = 0; scanf("%d", &n2); long long n = n2; while(n>1) { if(n%2==1) { n = n*3+1; } else { n /= 2; } count++; } printf("%dn",count); return 0; }
8、 阶乘之和
#include#include int main() { //阶乘之和 const int MOD = 1000000; int n, S = 0; scanf("%d",&n); for(int i=1;i<=n;i++){ int fa = 1; for(int j=1;j<=i;j++){ fa = (fa*j)%MOD; } S = (S+fa)%MOD; } printf("%dn", S); printf("Time used = %.2fn",(double)clock()/CLOCKS_PER_SEC); return 0; }
9、利用输入输出重定向,将程序的输入和输出保存到文件中。
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
10、 数据统计
#include#include #define LOCAL #define INF 1000000000 int main() { //数据统计(重定向版) #ifdef LOCAL freopen("data.in","r",stdin); freopen("data.out","w", stdout); #endif // LOCAL int x, n = 0, min = INF, max = -INF, s = 0; while(scanf("%d", &x)==1){ s += x; if(x max) max = x; n++; } printf("%d %d %.3fn", min, max, (double)s/n); return 0; }
11、 水仙花数
#includeint main() { //水仙花数 for(int i=100;i<=999;i++){ int n = i; int s = 0; while(n!=0){ int m = n%10; s += m*m*m; n /= 10; } if(s==i) printf("%dn",i); } return 0; }
12、 韩信点兵
#includeint main() { //韩信点兵 int a, b, c; scanf("%d%d%d",&a, &b, &c); for(int i=10;i<100;i++){ if((i%3==a)&&(i%5==b)&&(i%7==c)){ printf("%dn",i); return 0; } } printf("no answer"); return 0; }
13、倒三角形
#includeint main() { //倒三角形 int n; scanf("%d", &n); int a = 2*n-1; int b = 0; for(int i=0;i 14、子序列的和
输入两个正整数n<m<10 6 ,输出 ,保留5位小数。输入包含多组数据,
结束标记为n=m=0。提示:本题有陷阱。
####样例输入:
2 4
65536 655360
0 0
####样例输出:
Case 1: 0.42361
Case 2: 0.00001注:陷阱就是在n特别大时如果直接n*n就会溢出,所以只能连除两次
#includeint main() { //子序列的和 int n,m; while(1){ scanf("%d%d",&n,&m); if((n==0)&&(m==0)){ break; } double s = 0; for(int i=n;i<=m;i++){ s += 1.0f/i/i; } printf("%.5fn",s); } return 0; } 15、分数化小数:
#includeint main() { //分数化小数 int a,b,c,cnt=0; while(1){ scanf("%d%d%d",&a,&b,&c); if(a+b+c==0) break; printf("Case %d: %.*lfn",++cnt,c,a*1.0/b);//保留变量小数位数,用* } return 0; } 16、排列
#include#include int main() { int abc,def,ghi,sum=0,i; int s[10]; for(abc=123;abc<=329;abc++)//最小a的三位数范围,987/3=329 { memset(s, 0, sizeof(s));//memest函数可以对数组,指针进行初始化非常方便 def=abc*2; ghi=abc*3; s[abc/100]=s[abc/10%10]=s[abc%10]=1; s[def/100]=s[def/10%10]=s[def%10]=1; s[ghi/100]=s[ghi/10%10]=s[ghi%10]=1; for(i=1;i<=9;i++) { sum=sum+s[i]; } if(sum==9) { printf("%d %d %dn",abc,def,ghi); } sum=0;//再次进行循环时,要记得对sum和s数组进行初始化 memset(s, 0, sizeof(s)); } return 0; } 17、关灯问题
#include#include #define maxn 1010 int a[maxn]; int main() { //开灯问题 n盏灯,k个人 int n, k, first = 1; memset(a, 0, sizeof(a)); scanf("%d%d", &n, &k); for(int i=1;i<=k;i++){ for(int j=1;j<=n;j++){ if(j%i==0){ a[j] = !a[j]; } } } for(int i=1;i<=n;i++){ if(a[i]){ if(first) first=0; else printf(" "); printf("%d",i); } } printf("n"); return 0; } 18、蛇形填数
#include#include #define maxn 20 int a[maxn][maxn]; int main() { //蛇形填数 int n, x, y, tot = 0; scanf("%d",&n); memset(a,0,sizeof(a)); tot = a[x=0][y=n-1] = 1; while(tot =0 && !a[x][y-1]) a[x][--y] = ++tot; while((x-1)>=0&& !a[x-1][y]) a[--x][y] = ++tot; while((y+1)



