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