C語言經典程式設計題--哥德巴赫猜想 、完數 、猜數字等
一、 驗證歌德巴赫猜想:任意一個不小於6的偶數都可以表示成兩個素數的和。從鍵盤任意給一個符合條件的數,輸出相應的兩個素數。
素數:指在一個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數
程式碼如下:
#include <stdio.h> #include <math.h> int sushu(int n) { int i,j; for(i = 2;i <= sqrt(n + 1);i++) { if(!(n%i)) return 0; break; } return 1; } int main() { int a,b,N; int i; printf("Please input a number N: N >= 6 && N%2==0\n"); scanf("%d",&N); if((N < 6) || (N & 1)) { printf("Please input a correct number!\n"); return 0; } else { for(i = 2;i <= N/2;i++) { if(sushu(i) && sushu(N -i)) printf("%d = %d + %d\n",N,i,N-i); break; } } return 0; }
判定一個數是否為素數的簡單方法:
#include <stdio.h>
int sushu(int n)
{
int i,j;
for(i = 2;i <= sqrt (n + 1);i++)
{
if(!(n%i))
return 0;
}
return 1;
}
二、完數問題:
題目:一個數如果恰好等於它的因子之和,這個數就稱為“完數”。例如6=1+2+3.程式設計
找出1000以內的所有完數。
程式碼如下:
#include <stdio.h> int Sum(int n) { int i; int sum = 0; for(i = 1;i < n;i++) { if(!(n%i)) sum += i; } return sum; } int main() { int j; for(j = 2;j < 1000;j++) { if(Sum(j) == j) printf("%d is a wanshu!\n",j); } return 0; }
三、題目:猜數字遊戲
需求定義:
編寫程式,實現控制檯的猜數字遊戲。遊戲執行時產生一個0-100之間的隨機整數,要求使用者從控制檯輸入數字,若輸入的數字比產生的數字小,則輸出:“太小了,再大一點!”;若輸入的數字比產生的數字大,則輸出:“太大了,再小一點!”,若輸入的數字和產生的數字相等,則輸出:“恭喜你猜對了!”然後退出程式;若使用者猜了10次還未猜對,則輸出:“你太笨了,下次再來吧!”然後退出程式。
程式如下:
#include <stdio.h> #include <stdio.h> int main() { int n,m; int count = 0; srand((unsigned int)time(NULL)); n = rand(); n %= 100; while(count < 10) { printf("Please input a number:\n"); scanf("%d",&m); if(m == n) { printf("You are right!\n"); return 0; } else if(m < n) { printf("Too small !Please bigger!\n"); count++; } else { printf("Too big!Please smaller!\n"); count++; } } printf("You are stupid!Next!\n"); printf("This num is %d",n); return 1; }
執行結果如下:
[email protected]:~/qiang/caishuzi$ ./caishuzi
Please input a number:
50
Too big!Please smaller!
Please input a number:
25
Too small !Please bigger!
Please input a number:
37
Too small !Please bigger!
Please input a number:
43
Too big!Please smaller!
Please input a number:
40
Too big!Please smaller!
Please input a number:
39
You are right!
這裡有個函式,產生一個隨機數,大家可以記一下
srand((unsigned int)time(NULL));
n = rand();
實際產生的數可能會很大,這裡可以 n %=100,生成的數就是1~100之內的數了,可能不符合規範,但可以達到目的!
四、題目:將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。
程式分析:對n進行分解質因數,應先找到一個最小的質數k,然後按下述步驟完成:
(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,打印出即可。
(2)如果n<>k,但n能被k整除,則應打印出k的值,並用n除以k的商,作為新的正整數你n,
重複執行第一步。
(3)如果n不能被k整除,則用k+1作為k的值,重複執行第一步
執行程式:
#include <stdio.h>
int main()
{
int i,n;
printf("Please input a num:\n");
scanf("%d",&n);
printf("%d = ",n);
for(i = 2;i <= n;i++)
{
while(n != i)
{
if(n%i == 0)
{
printf("%d*",i);
n = n/i;
}
else
break;
}
}
printf("%d\n",n);
}
執行結果如下:
[email protected]:~/qiang/14$ ./14
Please input a num:
9
9 = 3*3
[email protected]:~/qiang/14$ ./14
Please input a num:
36
36 = 2*2*3*3
[email protected]:~/qiang/14$
五、題目:寫一個函式,統計一個int型資料中有多少位為1;
程式分析:我們知道,如果判定某位是否為1的方法,一個整型資料有多少位為1,可以對此資料進行移位操作,然後判定最後一位是否為1,程式碼如下:
#include <stdio.h>
int main()
{
int n,count = 0;
int i;
printf("Please input a num:\n");
scanf("%d",&n);
for(i = 0; i < 32;i++)
{
if(n & 0x01)
{
count++;
}
n >>= 1;
}
printf("Total 1 = %d\n",count);
}
執行結果如下:
[email protected]:~/qiang/int$ ./3
Please input a num:
8
Total 1 = 1
[email protected]:~/qiang/int$ ./3
Please input a num:
15
Total 1 = 4
[email protected]:~/qiang/int$
六、鞍點問題
題目:有一個3X4矩陣,要求輸出其鞍點(行列均最大的值),以及它的行號和列號。
int a[3][4] = {{123,94,-10,218},
{3,9,10,-83},
{145,16,44,-99}
};
程式分析:首先要搞明白鞍點不止一個,這題肯定涉及到對二維資料的遍歷,然後比較大小,先找出當前行最大值,然後判定其在當前列是否為最大值,如果是,則輸出
程式碼如下:
#include <stdio.h>
int main()
{
int a[3][4] ={
{123,94,-10,218},
{3,9,10,-83},
{145,16,44,-99}
};
int i,j,k;
char flag,flag1;
for(i = 0; i < 3; i++ )
{
for(j = 0; j < 4; j++)
{
flag = 0;
flag1 = 0;
for(k = 0 ;k < 4;k++)
{
if(a[i][j] < a[i][k])//當前行是否最大
flag = 1;
}
for(k = 0 ;k < 3;k++)
{
if(a[i][j] < a[k][j])//當前列是否最大
flag1 = 1;
}
if(!flag && !flag1)//當前行當前列是否都是最大
printf("hang:%d lie:%d = %d\n",i,j,a[i][j]);
}
}
return 0;
}
執行結果如下:
[email protected]:~/qiang/andian$ ./andian
hang:0 lie:3 = 218
hang:2 lie:0 = 145
[email protected]:~/qiang/andian$
七、題目、陣列歸併
已知兩個升序陣列a、b及空陣列c:
int a[] = {1,3,5,7,9,11,13,15,17,19};
int b[] = {2,4,6,8,10,12,14,16,18,20};
int c[20] ;
編寫程式將兩個陣列完成歸併,並存入陣列c中;
#include <stdio.h>
int main()
{
int a[] = {1,3,5,7,9,11,13,15,17,19};
int b[] = {2,4,6,8,10,12,14,16,18,20};
int c[20];
int i, j, k;
i = j = k = 0;
while(i < 10 && j < 10)
{
if(a[i] > b[j])
c[k++] = b[j++];
else
c[k++] = a[i++];
}
while(i < 10)
c[k++] = a[i++];
while(j < 10)
c[k++] = b[j++];
printf("c[] = ");
for(k = 0;k< 20;k++)
printf("%d ",c[k]);
printf("\n");
return 0;
}
執行結果如下:
[email protected]:~/qiang/shuzu$ gcc -o shuzu7 shuzu7.c
[email protected]:~/qiang/shuzu$ ./shuzu7
c[] = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[email protected]:~/qiang/shuzu$
八、指標輸入一個字串,內有數字和非數字字元,如a123X456 17960? 302tab5876 將其中連續的數字作為一個整數,一次存放到整數型陣列a中,例如123放到 a[0],456放到 a[1]中,統計有多少個整數,並輸出這些數;
程式碼如下:
<pre name="code" class="cpp">#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char b[100];
int a[100];
memset(a,'\0',100);
char *p = b;
int i = 0;
int j;
int sum = 0;
int count = 0;
int flag = 1;//標誌位,遇到數字為0,遇到非數字為1;此處其初始值為1,預設首字元前面還是非數字,不輸出整數,主要配合下面的程式
printf("請輸入字串:\n");
gets(b);
while(*p )
{
if(*p <= '9' && *p >= '0')
{
flag = 0;//遇到數字,flag=0
sum = sum*10 + *p++ - '0';//將字元數字轉化成整數,此時並不輸出。當下一個字元為非數字時,才輸出
}
else
{
while(flag == 0)//此時讀到非數字字元,判斷此時flag,如果此時flag為0.說明上一個字元為數字
{
a[i++] = sum ;//此時將數字輸出,賦給a[i],i++
sum = 0;//將sum清零
flag = 1;//非數字字元,flag置1
}
p++;//此時flag為1,沒有整數輸出,則看下一個字元
}
}
//字串結束後,會遇到兩種情況,一個是最後一個字元為數字,另一種是非數字字元
if(flag == 0)//因為前面的程式中,整數的下一個字元為非數字時,才會輸出整數,若最後一個是數字的話,則無法輸出,所以這裡對最後一個字元進行判斷
a[i] = sum;//將最後一個整數輸出
else
i--;//此時最後一個字元為非數字,沒有整數輸出,但i多加了一次,所以此處i--
count = i + 1;//整數個數為i+1
printf("共有%d個整數\n",count);
printf("這些整數是:\na[]=");
for(j = 0; j < i+1; j++)
printf("%d ",a[j]);
printf("\n");
return 0;
}
執行結果如下:
[email protected]:~/qiang/tmp$ ./zhizhen1
請輸入字串:
123xiao45 ?<er97
共有3個整數
這些整數是:
a[]=123 45 97
[email protected]:~/qiang/tmp$ ./zhizhen1
請輸入字串:
xiao12jian5w4gd67dd
共有4個整數
這些整數是:
a[]=12 5 4 67
[email protected]:~/qiang/tmp$
九、連結串列問題
建立一個單向連結串列,實現一個簡單的學生成績統計系統
程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define DEBUG() printf("%s %s %d\n",__FILE__,__FUNCTION__,__LINE__)
typedef struct grade
{
int score;
char name[10];
struct grade *next;
}Node;
Node *CreateList()
{
Node *p,*head,*tail;
head = (Node *)malloc(sizeof(Node));
if(head == NULL)
{
printf("malloc fails!\n");
return 0;
}
head->next = NULL;
tail = head;
int i = 0;
while(1)
{
int s;
char n[10];
printf("Please input the student's name!\n");
gets(n);
printf("Please input the student's score!\n");
scanf("%d",&s);
getchar();
if( s )
{
p = (Node *)malloc(sizeof(Node));
if(p == NULL)
{
printf("malloc fails!\n");
return 0;
}
p->score = s;
strcpy(p->name,n);
p->next = NULL;
printf("name:%s score:%d\n",p->name,p->score);
tail->next = p;
tail = p;
}
else
{
return head;
}
}
}
DisplayList(Node *pnode)
{
pnode = pnode->next;
while ( pnode )
{
printf("name:%-6s score:%d\n",pnode->name,pnode->score);
pnode = pnode->next;
}
}
LookupList(Node *p)
{
char n[10];
char *t = n;
printf("Please input the name you want:\n");
gets(n);
p = p->next;
while( p != NULL)
{
if (!strcmp(p->name,t))
{
printf("%s' score is: %d\n",t,p->score);
return 0;
}
else
p = p->next;
}
printf("%s is not exeit!Please input the correct name\n",t);
}
DestroyList(Node *p)
{
Node *q;
if(p->next != NULL)
{
q = p;
p = p->next;
free(q);
q = NULL;
}
}
InsertList(Node *p)
{
char n[10];
char *t = n;
printf("Please input the name you want to insert after:\n");
gets(n);
p = p->next;
while( p != NULL)
{
if (!strcmp(p->name,t))
{
int s;
char m[10];
printf("Please input the student's name!\n");
gets(m);
printf("Please input the student's score!\n");
scanf("%d",&s);
getchar();
Node *q;
q = (Node *)malloc(sizeof(Node));
strcpy(q->name,m);
q->score = s;
q->next = p->next;
p->next = q;
return 0;
}
else
p = p->next;
}
}
int main()
{
Node *p1;
p1 = CreateList();
DisplayList(p1);
LookupList(p1);
InsertList(p1);
DisplayList(p1);
DestroyList(p1);
return 0;
}
執行結果如下:
[email protected]:~/qiang/link$ ./link2
Please input the student's name!
xiao
Please input the student's score!
100
name:xiao score:100
Please input the student's name!
zhi
Please input the student's score!
85
name:zhi score:85
Please input the student's name!
qiang
Please input the student's score!
88
name:qiang score:88
Please input the student's name!
ming
Please input the student's score!
77
name:ming score:77
Please input the student's name!
hui
Please input the student's score!
78
name:hui score:78
Please input the student's name!
null
Please input the student's score!
0
name:xiao score:100
name:zhi score:85
name:qiang score:88
name:ming score:77
name:hui score:78
Please input the name you want:
qiang
qiang' score is: 88
Please input the name you want to insert after:
ming
Please input the student's name!
fang
Please input the student's score!
92
name:xiao score:100
name:zhi score:85
name:qiang score:88
name:ming score:77
name:fang score:92
name:hui score:78
[email protected]:~/qiang/link$
相關推薦
C語言經典程式設計題--哥德巴赫猜想 、完數 、猜數字等
一、 驗證歌德巴赫猜想:任意一個不小於6的偶數都可以表示成兩個素數的和。從鍵盤任意給一個符合條件的數,輸出相應的兩個素數。 素數:指在一個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數 程式碼如下: #include <stdio.h>
C語言程式設計-1136-哥德巴赫猜想
Problem Description 驗證“每個不小於6的偶數都是兩個素數之和”,輸入一個不小於6的偶數n,找出兩個素數,使它們的和為n。 Input 輸入一個不小於6的偶數n。 Output 找出兩個素數,使它們的和為n。只需要輸出其中第一個素數最小的一組資料即可。 Sample Inp
Codeforces Round #324 (Div. 2) (B排列組合)(C貪心)(D哥德巴赫猜想 數論+暴力)
題意:。。。。 思路:剛開始還想用什麼字串模擬或者大數什麼的,後來想了想差點笑出聲來,樣例就是用來忽悠人的。。。 #include <bits/stdc++.h> #define ll
經典演算法之哥德巴赫猜想
哥德巴赫猜想:任意一個大於6的偶數都可以寫成兩個素數的和(素數:除了1和它本身以外不再被其他的除數整除。) <span style="font-size:18px;">class Prog
c/c++程式設計題 之 驗證哥德巴赫猜想
驗證哥德巴赫猜想 題目描述 哥德巴赫猜想:任何一個大於6的偶數均可表示為兩個素數之和。輸入兩個整數m,n(6小於等於m,m小於等於n,n小於等100),將m,n之間的偶數表示成兩個素數之和 輸入描述 輸入兩個大於6的正整數分別給
C語言驗證哥德巴赫猜想程式碼及及解析
問題描述 2000以內的不小於4的正偶數都能夠分解為兩個素數之和(即驗證歌德巴赫猜想對2000以內的正偶數成立)。 問題分析 根據問題描述,為了驗證歌德巴赫猜想對2000以內的正偶數都是成立的,要將整數分解為兩部分,然後判斷分解出的兩個整數是否均為素數。若是,則滿足題意,否則應重新進行分解和判斷。 演
6-3 使用函式驗證哥德巴赫猜想 (10 分)c語言解答(附上我覺得注意點)
6-3 使用函式驗證哥德巴赫猜想 (10 分) 本題要求實現一個判斷素數的簡單函式,並利用該函式驗證哥德巴赫猜想:任何一個不小於6的偶數均可表示為兩個奇素數之和。素數就是隻能被1和自身整除的正整數。注意:1不是素數,2是素數。 函式介面定義: int prime( int p ); vo
哥德巴赫猜想的證明(C語言)
Problem Description 哥德巴赫猜想:“任一大於2 的偶數都可寫成兩個質數之和” 現在通過設計程式在4 -100 內任選一個偶數驗證這個猜想,輸入一個不小於2的偶數n,找出兩個素數,使它們的和為n。 Input 輸入一個不小於2的偶數n。 Out
【C語言】哥德巴赫猜想
問題:計算得到某一區間內所有符合哥德巴赫猜想的數。 背景:哥德巴赫猜想:任一大於2的偶數都可寫成兩個素數之和。 思路: 1.得到這個區間內的所有素數,放入一陣列。 2.計算這些素數之間的和。 3.得解。 程式: #inc
用C++驗證哥德巴赫猜想
作者 cout end c++ mes post clu 1.2 prim /*時間:2018.1.25作者:小島的水*/#include<iostream>using namespace std;//驗證哥德巴赫猜想:任何一個大於六的偶數可以表示為兩個素數之和
P1579 哥德巴赫猜想(升級版) <洛谷> (C++)(篩法選素數)
時間 turn std str ems main math mem num 兩層循環找到其中兩個值,最後一個值由輸入的num減去他們的和可得到,若都是質數則可以輸出 篩法選素數可稍微優化判斷素數的時間 代碼如下 #include<stdio.h> #inclu
驗證哥德巴赫猜想(C++)
哥德巴赫猜想: 1)任一不小於6的偶數,都可以表示成兩個奇質數之和 2)任一不小於9的奇數,都可以表示成三個奇質數之和 尤拉也提出另一個等價版本,即任一大於2的偶數都可寫成兩個質數之和。尤拉的命題比哥德巴赫的命題要求更高。現通常把這兩個命題統稱為哥德巴赫猜想。 演算法: 將6~n
搜尋題 P1579 哥德巴赫猜想(升級版) 洛谷 簡單
題目背景 1742年6月7日哥德巴赫寫信給當時的大數學家尤拉,正式提出了以下的猜想:任何一個大於9的奇數都可以表示成3個質數之和。質數是指除了1和本身之外沒有其他約數的數,如2和11都是質數,而6不是質數,因為6除了約數1和6之外還有約數2和3。需要特別說明的是1不是質數。 這就是哥德巴
課堂線上Java程式設計 哥德巴赫猜想
偶數分解 歌德巴赫猜想:任何一個大於六的偶數可以拆分成兩個質數的和,打印出所有的可能 輸入n為偶數,輸出n的所有分界可能 如輸入 100 輸出: 100=3+97 100=11+89 100=17+8
c++ 哥德巴赫猜想
#include<iostream> //該程式為哥德巴赫猜(想輸出所有的組合) #include<cmath> using namespace std; int main(
演算法之每日一題:哥德巴赫猜想
#include<stdio.h> #include<math.h> //是否是素數 int is(int x){ int k=sqrt((float)x); int
15OJ題——驗證哥德巴赫猜想(素數問題)
/* * Copyright (c) 2014, 煙臺大學計算機學院 * All rights reserved. * 檔名稱:test.cpp * 作 者:李曉凱 * 完成日期:2
使用函數驗證哥德巴赫猜想
要求 整數 blog -h spa 判斷素數 item card tex 6-2 使用函數驗證哥德巴赫猜想(20 分) 本題要求實現一個判斷素數的簡單函數,並利用該函數驗證哥德巴赫猜想:任何一個不小於6的偶數均可表示為兩個奇素數之和。素數就是只能被1和自身整除的正整數
洛谷——P1579 哥德巴赫猜想(升級版)
驗證 一個空格 i++ -s define while char pac algorithm P1579 哥德巴赫猜想(升級版) 題目背景 1742年6月7日哥德巴赫寫信給當時的大數學家歐拉,正式提出了以下的猜想:任何一個大於9的奇數都可以表示成3個質數之和。質數是指除
洛谷 P1579 哥德巴赫猜想(升級版)
== bar spa class badge bsp span lba -c P1579 哥德巴赫猜想(升級版) 題目背景 1742年6月7日哥德巴赫寫信給當時的大數學家歐拉,正式提出了以下的猜想:任何一個大於9的奇數都可以表示成3個質數