1. 程式人生 > >C語言經典程式設計題--哥德巴赫猜想 、完數 、猜數字等

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


 三、題目:猜數字遊戲

需求定義:

編寫程式,實現控制檯的猜數字遊戲。遊戲執行時產生一個0100之間的隨機整數,要求使用者從控制檯輸入數字,若輸入的數字比產生的數字小,則輸出:“太小了,再大一點!”;若輸入的數字比產生的數字大,則輸出:“太大了,再小一點!”,若輸入的數字和產生的數字相等,則輸出:“恭喜你猜對了!”然後退出程式;若使用者猜了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個質數