plus_one
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>N
while(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){//最高位必然不为0
arr[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;
}else
return 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;
}