#include<stdio.h>//组合数 //long long 阶乘数较大 longlongfactorial(int n){longlong m =1;for(int i =1; i <= n; i++){
m *= i;}return m;}longlongC(int n,int m){returnfactorial(n)/(factorial(m)*factorial(n-m));}//组合数优化 longlongC2(int n,int m){if(m <(n-m)){//保证m为分母最大阶乘
m =(n-m);}longlong ans =1;//消掉分母最大阶乘后,n的剩余阶乘 for(int i = m+1; i <= n; i++) ans *= i;//除以较小阶乘 for(int i =1; i <= n-m; i++) ans /= i;return ans;}intmain(){//越界 printf("%d\n",C(25,12));printf("%d",C2(25,12));return0;}
4-3 素数判定
#include<stdio.h>#include<math.h>//最小素数为2(一般有强行规定) // n = 1 或 n 太大时不可调用//n太大溢出变为负数,for恒成立 intis_prime(int n){for(int i =2; i*i <= n; i++){if(n%i ==0){return0;}}return1;}intis_prime2(int n){//考虑 1 的情况 if(n <=1)return0;//C除法为取整,所以加0.5,达到四舍五入 int m =floor(sqrt(n)+0.5);for(int i =2; i <= m; i++){if(n % i ==0)return0;}return1;}intmain(){printf("%d\n",is_prime(46341));printf("%d",is_prime2(46341));return0;}
4-6 交换变量
#include<stdio.h>voidswap(int* a,int* b){int t =*a;*a =*b;*b = t;}intmain(){int a =2, b=3;swap(&a,&b);printf("%d %d\n", a, b);return0;}
4-8 计算数组的元素和
#include<stdio.h>//传入的是首地址, n代表数组长度 intsum(int*a,int n){int ans =0;for(int i =0; i < n; i++){
ans += a[i];}return ans;}intmain(){return0;}
4-9 左闭右开区间内的元素和
#include<stdio.h>//左闭右开//1. begin作为数组名进行累加 intsum(int* begin,int* end){int n = end-begin;int ans =0;for(int i =0; i < n; i++){
ans += begin[i];}return ans;}//2. 指针p指向累加值 intsum2(int* begin,int* end){int*p = begin;int ans =0;for(int*p = beginl p != end; p++){
ans +=*p;}return ans;}intmain(){return0;}
习题
4-1 古老的密码(1339)
#include<stdio.h>#include<string.h>char anph[26];char s1[105];char s2[105];intmain(){scanf("%s %s", s1, s2);int ok =1;for(int i =0; i <strlen(s1); i++){
anph[s1[i]-'A']++;}for(int i =0; i <strlen(s2); i++){if(anph[s2[i]-'A'+1]--==0){printf("NO");
ok =0;break;}}if(ok)printf("YES");return0;}