plus_one

GJ504b發表於2024-11-27

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