藍橋杯C/C++第三次培訓
阿新 • • 發佈:2021-01-18
1.日期處理
在藍橋杯比賽中日期處理是經常考的題目是難點也是重點,但做出題目的方法有很多,Excel表格熟練的同學可以用Excel表格做出來,但用Excel表格做會花費很長時間才能做出來,而且不一定能作對,感覺很不划算,今天我們用C語言一起來解決它
1.1預備知識
1.1.1swap函式
swap函式是C++中algorithm標頭檔案下的函式,其作用是交換兩個數的值
swap(x,y)用來交換x,y,的值
程式碼示例
#include <stdio.h>
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int x,y;
cin>>x>>y;
swap(x,y);
cout<<x<<" "<<y<<endl;
return 0;
}
一個n位整數x取後m位陣列成的數:x%pow(10,m),pow(a,b)表示a的b次方在math.c裡面,去前n-m位數:x/pow(10,n-m)
1.2取兩個日期之間相差的天數
思路解析
設兩個日期time1、time2,相差日期ans,time1在前,time2在後,具體處理:每當ans加1,time1加1,直到time1等於time2。
注意問題:
- 平年和閏年及判斷
- 當time1加一後的天數d等於當前月份天數加一時,d置為1,月份m加1,當m等於13時,m置為1,年份y加1
參考程式碼
#include <stdio.h>
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int day[13][2]={0,0,31,31,28,29,31,31,30,30,31,31,30,30,31,31,31,31,30,30,31,31,30,30,31,31};//儲存每月的天數
bool judge(int x)//平年、閏年判斷
{
if((x%4==0&&x%100!=0)||x%400==0)
return true;
return false;
}
int main()
{
int year1,year2,y1,y2,m1,m2,d1,d2;
while(scanf("%d %d",&year1,&year2)!=EOF)//多組輸入
{
if(year1>year2)//將日期設為year1<year2
{
swap(year1,year2);
}
//分別取年、月、日
y1=year1/10000;
m1=year1%10000/100;
d1=year1%100;
y2=year2/10000;
m2=year2%10000/100;
d2=year2%100;
int ans=0;//設定相差天數為0,例2020/1/1與2020/1/2相差一天
while(y1<y2||m1<m2||d1<d2)
{
ans++;//相差天數加1
d1++;
if(d1==day[m1][judge(y1)]+1)//當d1比當前月份天數大一天(天數滿足當前天數)
{
d1=1;//天置為1
m1++;//月份加1
}
if(m1==13)//當過了12月
{
m1=1;//月份置為1
y1++;//年份加1
}
}
cout<<ans<<endl;
}
}
2進位制轉換
在生活經常使用的是10進位制,而計算機當中經常使用二進位制,另外還有八進位制,十六進位制。他們之間的進位制轉換‘必須掌握
2.1將p進位制x轉為十進位制y
將其轉為10進位制y
程式碼演示
#include <stdio.h>
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int p,x;//p進位制數x
cin>>x>>p;
int ans=0;//轉化為十進位制的結果
int y=1;//每位數乘的p的次方項p^0,p^1,p^2...p^n-1
while(x)
{
int a=x%10;//去x的每一位數
x=x/10;
ans+=a*y;
y=y*p;
}
cout<<ans<<endl;
return 0;
}