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')

alt text

/*统计字符*/
#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;
}

最大公约数与最小公倍数

  1. 保证已知两个数的关系【假设M>N】
    if+交换 实现

  2. tmp_M,tmp_N储存M,N的值【1】

  3. 最大公因数 直接背吧
    while(较小数!=0){
    因数=小的数
    小的数=大数%小数
    大数=因数
    }

    alt text

  4. 最小公倍数
    最开始的M*N / 最大公因数【1】

alt text

#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;
}

分割数字的各个位

  1. 讨论0,是0,直接输出
    !!!也要按格式,0后面有空格
  2. 也是套路,从各位输出直到最高位,因为要从高位到低位,所以用数组
    alt text

alt text
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;
}

找完数

  1. 主程序实现在区间的数字遍历,给函数传入数字
  2. wanshu函数里找区间里的每个数字找到就按格式打印完数
  • 先找到因数之和
  • 判断==原来的数字?
  • 等于就可以先打印 完数 = 1这个部分了
  • 然后从2开始按照开始找因数的逻辑在循环中打印 + 因数n格式
  • 最后返回1代表找到完数
  • 否则返回0代表没有完数
  1. 返回1,计数器就+1,到所有数字遍历完了count还是0,主线程配合输出None
    一定注意,像count sum flag之类的一定要初始化

alt text

#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

这种方阵的题目就是先找到一个定位点,比如左上角
然后看行列关系额,规律
alt text
左上角是
1 3 7 13
n * (n-1) -1
然后每行+1,j++,每列相差n,所以i-=n,联系上j,就是i=n * (n-1)i + j
唉,复杂,多读多背!!!

alt text

//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;
}

梅森数

alt text

#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;
}

alt text

#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;
}



alt text

#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;
}


posted @ 2024-11-27 00:28  GJ504b  阅读(4)  评论(0编辑  收藏  举报