目錄
一、對三個數進行排序
方法一:函式
方法二:依次交換數值
方法三:用if陳述句判斷條件
二、最大公約數和最小公倍數
1.最大公約數
(2)輾轉相除法
2.最小公倍數:
三、年份和日期問題
判斷是否是閏年:
四、素數
五、幾個函式
1.strcmp()
2.rand函式、srand函式和time函式
1.rand函式
2.srand函式
3.time函式和時間戳
六、簡單版猜字游戲
一、對三個數進行排序
方法一:函式
#include<stdio.h>
int MAX(int a,int b)
{
int max=a>b?a:b;
return max;
}
int MIN(int a,int b)
{
int min=a<b?a:b;
return min;
}
int main()
{
int a=0,b=0,c=0;
scanf("%d %d %d",&a,&b,&c);
int max=MAX(MAX(a,b),c);
int min=MIN(MIN(a,b),c);
int mid=a+b+c-max-min;
printf("%d,%d,%d",max,mid,min);
return 0;
}
方法二:依次交換數值
#include<stdio.h>
int main()
{
int a=0,b=0,c=0;
scanf("%d %d %d",&a,&b,&c);
if(a<b)
{
int tmp=a;
a=b;
b=tmp;
}//a中為a,b中的較大值;
if(a<c)
{
int tmp=a;
a=c;
c=tmp;
}
if(b<c)
{
int tmp=b;
b=c;
c=tmp;
}
printf("%d %d %d",a,b,c);
return 0;
}
方法三:用if陳述句判斷條件
#include<stdio.h>
int main()
{
int a=0,b=0,c=0;
scanf("%d %d %d",&a,&b,&c);
if(a<b&&b<c)
printf("%d %d %d",a,b,c);
if(a<c&&c<b)
printf("%d %d %d",a,c,b);
if(b<a&&a<c)
printf("%d %d %d",b,a,c);
if(b<c&&c<a)
printf("%d %d %d",b,c,a);
if(c<a&&a<b)
printf("%d %d %d",c,a,b);
if(c<b&&b<a)
printf("%d %d %d",c,b,a);
return 0;
}
二、最大公約數和最小公倍數
1.最大公約數
求出整數a,b兩個數的最大公約數
(1)方法一:遍歷法
#include<stdio.h>
int main()
{
int a=0,b=0;
scanf("%d %d",&a,&b);
int ret=0;
if(a>b)
ret=b;
else
ret=a;
while(1)
{
if(n%ret==0&&m%ret==0)
{
break;
}
else
ret--;
}
prinft("最大公約數是:%d",ret);
return 0;
}
(2)輾轉相除法
輾轉相除法也叫做歐幾里得法,具體的計算程序如下圖: 
#include<stdio.h>
int main()
{
int a=0,b=0;
scanf("%d %d",&a,&b);
if(a<b)
{
int tmp=a;
a=b;
b=tmp;
}
int ret=0;
while(ret=a%b)
{
a=b;
b=ret;
}
printf("最大公約數是:%d",b);
return 0;
}
2.最小公倍數:
求兩個數的最小公倍數方法比較簡單,只需要a*b再除以a,b的最大公約數
#include<stdio.h>
int main()
{
int a=0,b=0;
scanf("%d %d",&a,&b);
int num=b;
if(a<b)
{
int tmp=a;
a=b;
b=tmp;
}
int ret=0;
while(ret=a%b)
{
a=b;
b=ret;
}
printf("最小公倍數是:%d",a*num/b);
return 0;
}
三、年份和日期問題
判斷是否是閏年:
//求出1000到2000的所有閏年
#include<stdio.h>
#include <stdbool.h>
bool isrun(int n)
{
return (n%4==0&&n%400!=0)||(n%400==0);
}
int main()
{
int i=0;
for(i=1000;i<=2000;i++)
{
if(isrun(i))
{
printf("%d ",i);
}
}
return 0;
}

//思路是使用Kim larsen公式,也可以使用zelle公式
char * dayOfTheWeek(int day, int month, int year)
{
if(month==1||month==2)
{
month+=12;
year--;
}
int w=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400+1)%7;
char *arr[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
return arr[w];
}

bool isleapyear(int n)
{
return (n%4==0&&n%400!=0)||(n%400==0);
}
int strtoint(char*str,int len)//len為傳遞的字串的長度
{
int i=0;
int sum=0;
for(i=0;i<len;i++)
{
sum=sum*10+(str[i]-'0');
}
return sum;
}
int dayofyear(char*date)
{
int monthday=[31,28,31,30,31,30,31,31,30,31,30,31};
int year=strtoint(date,4);
int month=strtoint(date+5,2);
int dat=strtoint(date+8,2);
monthday[1]=isleapyear(year)?29:28;
int allday=0;
for(int i=1;i<month;i++)
{
allday=allday+monthday[i-1];
}
alllday=allday+day;
return allday;
}
四、素數
判斷一素數的個數
//判斷100到200之間素數的個數
#include<stdio.h>
#include<math.h>
int main()
{
int i=0;
int cnt=0;
for(i=100;i<201;i++)
{
int flag=1;
int j=0;
for(j=2;j<=sqrt(i);j++)
{
if(i%j==0)
{
flag=0;
break;
}
}
if(flag==1)
{
printf("%d ", i);
cnt++;
}
}
printf("\n");
printf("素數的個數是%d",cnt);
return 0;
}
素數判定 埃氏篩選

int countPrimes(int n)
{
if (n < 2)
{
return 0;
}
int isprime[n];
memset(isprime,0,sizeof(isprime));
int cnt=0;
for(int i=2;i<n;i++)
{
if(!isprime[i])//2是偶素數
{
cnt++;
if((long long)i*i<n)
{
for(int j=i*i;j<n;j+=i)
{
isprime[j]=1;
}
}
}
}
return cnt;
}
五、幾個函式
1.strcmp()

strcmp函式的作用是比較兩個字串的關系
![]()
strcmp函式的回傳值有三種情況:大于0,等于0,小于0;

這些函式中的每一個的回傳值表示 string1 到 string2 的字典關系,string1 到 string2 的值關系
< 0 string1 小于 string2
0 string1 與 string2 相同
> 0 string1 大于 string2
這里的大小是值字串的ASCII碼值,兩個字串從左到右依次比較每一個字符的ASCII值,直到遇見不同的字符或者'\0'為止,
#include <string.h>
int main()
{
int i = 0;
char password[20] = "";
for (i = 0; i < 3; i++)
{
printf("請輸入密碼:>");
scanf("%s", password);
if (strcmp(password, "123456") == 0)//比較2個字串是否相等,不能使用==,而應該使用strcmp
{ //這個函式
printf("登陸成功\n");
break;
}
else
{
printf("密碼錯誤\n");
}
if (i == 3)
{
printf("三次密碼均錯誤,退出程式\n");
}
return 0;
}
2.rand函式、srand函式和time函式
1.rand函式

rand 回傳一個偽亂數,rand()函式是使用線性同余法做的,它并不是真的亂數,因為其周期特別長,所以在一定范圍內可以看成隨機的,
rand 函式回傳一個范圍為 0 到 RAND_MAX 的偽隨機整數, 在呼叫 rand 之前,使用 srand 函式為偽亂數生成器設定種子,
生成[0,1]的亂數
num=rand()/RAND_MAX;
2.srand函式

srand函式的作用是生成亂數的生成種子,種子的任何其他值都將生成器設定為隨機起點, rand 檢索生成的偽亂數, 在對 srand 的任何呼叫之前呼叫 rand 生成的序列與以 1 傳遞的種子呼叫 srand 生成的序列相同,
那我們如何引入一個種子?
3.time函式和時間戳

函式功能: 得到當前日歷時間或者設定日歷時間,回傳值:time 回傳以秒為單位的時間, 回傳值會轉化為一個時間戳,
通俗的講,時間戳(timestamp)是一份能夠表示一份資料在一個特定時間點已經存在的完整的可驗證的資料,

一般來說,我們會使用time(NULL)或time(0)來表示變化的種子,為unsigned int型別,當我們在不同時刻運行程式時,就會有不同的亂數種子,因此就可以得到不同的結果,如果我們想要生成亂數我們可以使用以下代碼
srand((unsign int) time(NULL))
int num=rand()
六、簡單版猜字游戲
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("*******************************************\n");
printf("*******************************************\n");
printf("*******************************************\n");
printf("*************** 1.play ***************\n");
printf("*************** 0.exit ***************\n");
printf("*******************************************\n");
printf("*******************************************\n");
printf("*******************************************\n");
}
void play()
{
int k = rand()%100+1;
int a = 0;
printf("這個數字在1到100之間\n");
for (int i = 5;i > 0;i--)
{
printf("請輸入你認為正確的數字:\n");
scanf("%d", &a);
if (a > k)
{
printf("這個數字大了\n");
}
else if (a == k)
{
printf("恭喜你猜對了\n");
printf("真厲害\n");
break;
}
else
{
printf("這個數字小了\n");
}
if (i - 1 > 0)
{
printf("加油!你還有%d次機會\n", i - 1);
}
if (i - 1 == 0)
{
printf("很遺憾,機會用光了,請重新開始");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));//生成隨機時間;
int input = 0;
do
{
printf("---------------猜數字游戲----------------\n");
menu();
printf("請選擇開始游戲:\n");
scanf("%d", &input);
switch(input)
{
case 1:
printf("開始游戲\n");
play();
break;
case 2:
printf("退出游戲\n");
break;
default :
printf("請輸入正確的數字:\n");
break;
}
} while (input);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342311.html
標籤:其他
上一篇:玩兒轉C語言——猜數字游戲詳解
