2024/11/26 --2024/11/28
验证哥德巴赫猜想
打印漏斗
1.统计字符
1. 不需要数组,在循环中统计各个种类的字符
2. 一定把各个种类初始化为0
3. 一个一个字符输入,不是字符串一次输入哦
4. 空格是' ' 回车是 '\n'
5. 大小写字母的ASCII码不连续,所以是(s >= 'a'&& s<= 'z') || (s>= 'A'&& s<= 'Z')
/*统计字符*/
#include<stdio.h>
int main(){int letter, blank, digit, other, i;letter = 0;blank = 0;digit = 0;other = 0;//初始化呀!!!char s;for(i=0;i<10;i++){//不用数组scanf("%c",&s);if(s >= '0' && s <= '9'){digit ++;}else if(s == ' '|| s== '\n'){blank ++;}else if((s >= 'a'&& s<= 'z') || (s>= 'A'&& s<= 'Z')){letter ++;}else{other ++;}}printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other); return 0;
}
最大公约数与最小公倍数
-
保证已知两个数的关系【假设M>N】
if+交换 实现 -
tmp_M,tmp_N储存M,N的值【1】
-
最大公因数 直接背吧
while(较小数!=0){
因数=小的数
小的数=大数%小数
大数=因数
}
-
最小公倍数
最开始的M*N / 最大公因数【1】
#include<stdio.h>
int main(){int M,N,tmp,min_beishu, max_yinshu, tmp_M,tmp_N;scanf("%d %d",&M,&N);tmp_M=M;tmp_N=N;if(M<N){tmp = M;M = N;N = tmp;}//保证M>Nwhile(N!=0){//小的数不为0 //小的数不为0---因数=小的数,小的数=大数%小数,大数=因数max_yinshu = N;N = M % N;M = max_yinshu;}//通过不断用较小数替换较大数,并用余数替换较小数,最终得到的非零余数就是两个数的最大公约数。min_beishu=(tmp_M*tmp_N)/max_yinshu;printf("%d %d",max_yinshu,min_beishu);return 0;
}
分割数字的各个位
- 讨论0,是0,直接输出
!!!也要按格式,0后面有空格 - 也是套路,从各位输出直到最高位,因为要从高位到低位,所以用数组
3. 逆序输出
【启示】
看到非负数,一定单独想想0!!
#include<stdio.h>
int main(){int input, i, arr[100], count;scanf("%d",&input);i = 0;count =0;if(input == 0){printf("0 ");//(1)格式,后面有空格 (2) 是0要单独考虑}else{while(input>0){//最高位必然不为0arr[i] = input % 10;input /= 10;i ++;count ++;}for(i=count-1;i>=0;i--){printf("%d ",arr[i]);}}return 0;
}
找完数
- 主程序实现在区间的数字遍历,给函数传入数字
- wanshu函数里找区间里的每个数字,找到就按格式打印完数
- 先找到因数之和
- 判断==原来的数字?
- 等于就可以先打印
完数 = 1
这个部分了 - 然后从2开始,按照开始找因数的逻辑,在循环中打印
+ 因数n
格式 - 最后返回1,代表找到完数
- 否则返回0,代表没有完数
- 返回1,计数器就+1,到所有数字遍历完了count还是0,主线程配合输出None
【一定注意,像count sum flag之类的一定要初始化】
#include<stdio.h>
int wanshu(int num){int i, sum;sum = 0;for(i=1;i<num;i++){if(num % i == 0){sum += i;}}if(sum == num){printf("%d = 1",num);for(i=2;i<num;i++){if(num % i == 0){printf(" + %d",i);}}printf("\n");return 1;}elsereturn 0;
}
int main(){int m, n, i;int count;count = 0;//写了计数器必须count初始化scanf("%d%d",&m,&n);for(i=m;i<=n;i++){if(wanshu(i)){count ++;// break;//不可以写break,写了的话就是说wanshu()只传了一个值}}if(0 == count){printf("None");}return 0;
}
按要求输出方阵
多读多背
i=n * (n-1)
i -= n
i + j
这种方阵的题目就是先找到一个定位点,比如左上角
然后看行列关系额,规律
左上角是
1 3 7 13
n * (n-1) -1
然后每行+1,j++,每列相差n,所以i-=n
,联系上j,就是i=n * (n-1)
和i + j
唉,复杂,多读多背!!!
//5-1输出方阵
#include<stdio.h>
int main(){int i, j, n;scanf("%d", &n);for(i=n * (n-1) ; i >= 0 ; i -= n) {for ( j = 1; j < n; j++ ){printf("%4d", i + j);}printf("\n");} return 0;
}
梅森数
#include<stdio.h>
int suShu(int number){for(int i=2;i*i<=number;i++){//是小于等于,if(number % i == 0){return 0;}}return 1;}
int meisenShu(int number,int n){for(int i=2;i<=n;i++){if((number + 1) == 1 << i ){return 1;}}return 0;
}int main (){int n, total;int flag = 0;scanf("%d",&n);
// total = pow(2,n) - 1;total = (1 << n) - 1;for(int i=2;i<=total;i++){if(meisenShu(i,n) && suShu(i)){flag = 1;printf("%d\n",i);}}if(flag == 0){printf("None");}return 0;
}
#include<stdio.h>
int sushu(int number){for(int i=2;i*i<=number;i++){if(number % i == 0){return 0;}}return 1;}
int main(){long long int N,p,q;scanf("%lld",&N);for(p=2;p*p<=N;p++){if(sushu(p)){q = N - p;if(sushu(q)){printf("%lld = %lld + %lld",N,p,q);break;}}}return 0;
}
#include<stdio.h>
int maxtimesTop(int N){int i = 0;while(2*i*i <= N+1){i++;}return i-1;
}
int main(){int N, i, j, m, maxtimes, remain;char ch;scanf("%d %c",&N,&ch);maxtimes = maxtimesTop(N);remain = N - maxtimes*2*maxtimes + 1;for(i=0;i<maxtimes;i++){for(j=1;j<i+1;j++){printf(" ");}for(m=0;m<(maxtimes-i)*2-1;m++){printf("%c",ch);} printf("\n");}for(i=maxtimes-1;i>0;i--){for(j=i;j>1;j--){printf(" ");}for(m=0;m<(maxtimes-i)*2+1;m++){printf("%c",ch);} printf("\n");}printf("%d",remain);return 0;
}