常见编程题各解法
0 交换值
// 借助第三方变量 void swap(int *a,int *b){ int temp = *a; *a = *b; *b = temp; }
// 不借助第三方变量 void swap(int *a,int *b){ *a += *b; *b = *a - *b; *a -= *b; }
1 累计和
/* 循环 */ #include <stdio.h> int main(){ int i,sum = 0; //注意点 ① :累加需先初始化 for(i = 0; i <= 100; i++) sum+=i; printf("%d",sum); return 0; }
/* 递归 */ #include <stdio.h> /* 思路: 第N项的前N项和,等于前N-1项和 再加上第N项 递归出口: 第一项的前N项和为 1 */ int Recursion(int n){ if(n==1) return 1; return Recursion(n-1)+n; } int main(){ printf("%d",Recursion(100)); return 0; }
2 Fibonacci 数列
- 注意前几项是
0 1 1 2 ...
还是1 1 2 3 ...
- 以下按照第二种, 貌似考得更多
① 第N项 / 前N项
/* 循环 */ /* 相较于使用数组,占用内存小,不存储额外的数,只存储需要的第N项 */ #include <stdio.h> int main(){ //m第n项的值, m1前一项, m2前二项 int m, m1=1, m2=1; int i, n=10; // n 第几项 for(i = 2; i<n; i++){ m = m1 + m2; //可赋值打印同时 m2 = m1; m1 = m; } printf("%d",m); return 0; }
/* 循环 -- 数组 */ #include <stdio.h> #define N 10 int main(){ int i,fibonacci[N] = {1,1}; //初始化 第一二项为1 for(i=2; i<N; i++) fibonacci[i] = fibonacci[i-1] + fibonacci[i-2]; printf("第N项为:%d\n",fibonacci[N-1]); i = 0; while(i<N) printf("%d ",fibonacci[i++]); return 0; }
第N项为:55
1 1 2 3 5 8 13 21 34 55
/* 递归 */ #include <stdio.h> int fb(int n){ if(n==1 || n==2) return 1; return fb(n-1)+fb(n-2); } int main(){ for(int i=1;i<=10;i++){ printf("%d ",fb(i)); } printf("\n第10项为:%d",fb(10)); return 0; }
1 1 2 3 5 8 13 21 34 55
第10项为:55
② 前N项和
- 已求得第N项的值, 前N项和 额外加个累加就行了
/* 循环 */ #include <stdio.h> #define N 10 int main(){ int a[N] = {1,1},sum=2; for(i=2; i<N; i++) { a[i] = a[i-1] + a[i-2]; sum+=a[i]; } printf("%d",sum); return 0; }
143
/* 递归 */ #include <stdio.h> int Recursion(int n){ if(n==1 || n==2) return 1; return Recursion(n-1)+Recursion(n-2); } int sum(int n){ if(n==1) return 1; return sum(n-1)+Recursion(n); } int main(){ printf("%d",sum(10)); return 0; }
143
3 水仙花数
“水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。"
/* 循环遍历 */ #include <stdio.h> int main(){ int g,s,b; //个位,十位,百位 for(int i =100; i<1000; i++){ g = i%10; s = i/10%10; b = i/100%10; if(g*g*g+s*s*s+b*b*b==i) printf("%d ",i); } return 0; }
153 370 371 407
4 最大公约数与最小公倍数
/* 递归 -- 辗转相除法 */ #include <stdio.h> //参数要求: m>n int comdiv(int m,int n){ if(m%n) return comdiv(n,m%n); return n; } //参数要求: m>n int commul(int m,int n){ return m*n/comdiv(m,n); } int main(){ printf("最大公约数: %d\n",comdiv(12,8)); printf("最小公倍数: %d\n",commul(12,8)); return 0; }
/* 循环 -- 遍历 */ #include <stdio.h> int main(){ int m,n; scanf("%d%d",&m,&n); int i = m < n ? m:n; for(;i>1;i--) if(m%i==0&&n%i==0) break; printf("最大公约数为:%d\n",i); i = m > n ? m:n; for(;i<m*n;i++) if(i%m==0&&i%n==0) break; printf("最大公倍数为:%d",i); return 0; }
5 完数
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
如果一个数恰好等于它的真因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。
/* 循环 -- 10000以内的完全数 */ /* 错误版 -- 发现问题了吗? */ #include <stdio.h> int main(){ int i,j,sum=0; for(i = 0; i < 10000; i++){ for(j = 1; j < i; j++) if(i%j==0) sum+=j; if(sum==i) printf("%d ",i); } return 0; }
/* 循环 -- 10000以内的完全数 */ #include <stdio.h> int main(){ int i,j,sum; for(i = 1; i < 10000; i++){ sum = 0; //统计完重置 for(j = 1; j < i; j++) if(i%j==0) sum+=j; if(sum==i) printf("%d ",i); } return 0; }
6 28 496 8128
/* 调用函数 -- 10000以内的完全数 */ #include <stdio.h> // 返回 n 的因子之和 int factsum(int n){ int sum = 0; for(int j = 1; j < n; j++) if(n%j==0) sum+=j; return sum; } int main(){ int i,j,sum; for(i = 1; i < 10000; i++) if(factsum(i)==i) printf("%d ",i); return 0; }
6 N的阶乘
① 第N项
/* 循环 */ #include <stdio.h> #define N 10 int main(){ int res=1,i; for(i=1;i<=N;i++) res*=i; printf("%d",res); return 0; }
/* 递归 */ #include <stdio.h> int Recursion(int n){ if(n==1) return 1; return Recursion(n-1)*n; } int main(){ printf("%d",Recursion(10)); return 0; }
3628800
② 前N项
/* 递归 */ #include <stdio.h> int Recursion(int n){ if(n==1) return 1; return Recursion(n-1)*n; } void print(int n){ if(n) { print(n-1); printf("%d ",Recursion(n)); } } int main(){ print(10); return 0; }
1 2 6 24 120 720 5040 40320 362880 3628800
③ 前N项和
/* 递归 */ #include <stdio.h> int Recursion(int n){ if(n==1) return 1; return Recursion(n-1)*n; } int sum(int n){ if(n==1) return 1; return sum(n-1) + Recursion(n); } int main(){ printf("%d",sum(10)); return 0; }
4037913
7 各位值
/* 一个简单的打印例子, 打印 n */ void print(int n){ if(n){ print(n-1); // 打印 n-1 printf("%d ",n); // 打印 n } }
1 2 3 4 5 6 7 8 9 10
/* 递归打印 */ #include <stdio.h> void interval_print(int n){ if (n){ interval_print(n / 10); //与下一行 交换位置则反序打印 printf("%d ", n % 10); } } int main(){ interval_print(12345); return 0; }
1 2 3 4 5
/* 递归 -- 返回m的第n位(自右向左) */ #include <stdio.h> int number(int m,int n){ if(n==1) return m%10; return number(m/10,n-1); } int main(){ printf("%d",number(54321,4)); return 0; }
测试数据1: 54321,4
4
测试数据2: 347651,6
3
8 素数 / 质数
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
#include <stdio.h> /* 判断n是否为素数 */ int isPrime(int n){ for(int i = 2; i < n; i++) if(n%i==0) return 0; return 1; } /* 输出100以内的所有素数 */ int main(){ for(int i = 2; i<100; i++) if(isPrime(i)) printf("%d ",i); return 0; }
#include <stdio.h> /* 判断n是否为素数 */ int isPrime(int n){ for(int i = 2; i < n; i++) if(n%i==0) return 0; return 1; } /* 输出n以内(包括n)的所有素数 */ void print(int n){ if(n!=1) { print(n-1); if(isPrime(n)) printf("%d ",n); } } int main(){ print(100); return 0; }
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
9 杨辉三角
/* 递归 -- 推荐 */ #include <stdio.h> //返回i行j列的值 int fun(int i,int j){ if(j==1||i==j) return 1; //如果在第一列或者行列相同,返回1 return fun(i-1,j)+fun(i-1,j-1); //本列上一行 + 上一行前一列 } //输出前n行 void Triangle(int n){ if(n) { Triangle(n-1); //在其之前,输出前一行 for(int i=1;i<=n;i++) printf("%-5d",fun(n,i)); putchar(10); } } int main(){ Triangle(10); return 0; }
/* 循环 */ #include <stdio.h> #define M 10 //输出前10行 int main(){ int a[M]={1},b[M],i,j; printf("%-5d\n",a[0]); for(i = 2;i<=M;i++){ //第 i 行,根据行数控制内循环次数 if(i%2) //a,b循环交替 for(j = 0; j<i;j++) printf("%-5d\t",j==0?(a[j]=1):(a[j]=b[j]+b[j-1])); //首位必然为1,赋值打印同时进行 else for(j = 0; j<i;j++) printf("%-5d\t",j==0?(b[j]=1):(b[j]=a[j]+a[j-1])); a[j] = 0; b[j] = 0; //最后位补0,避免无法预料的随机值. 或者最后位的单独补充 putchar('\n'); } return 0; }
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
C 语言解 常见编程题(下):https://developer.aliyun.com/article/1489150