蓝桥训练1-3,5-8题解(自己写的,过了蓝桥官网的数据)
1.輸入一個無符號整數(shù)x,輸出x的二進(jìn)制表示中1的個數(shù).
輸入:
76584
輸出:
7
水題:數(shù)據(jù)應(yīng)該也不大,long long 也能過
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #include<cmath>typedef long long ll; using namespace std; int main() {unsigned long long n;cin>>n;int s=0;while(n){if(n%2==1){s++;}n/=2;} cout<<s<<endl;return 0;} 2.猴子第一天摘下若干個桃子,當(dāng)即吃了一半,還不過癮,又多吃了一個。第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下的一半零一個。到第十天早上想在吃時就只剩下一個桃子了。求第一天共摘了多少桃子。
(下面的不是正確答案)
輸出:
8?
逆向遞推
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #include<cmath>typedef long long ll; using namespace std; long long a[15]; int main() {a[10]=1;for(int t=9;t>=1;t--){a[t]=(a[t+1]+1)*2;}cout<<a[1]<<endl;return 0;}3. 計算一個無符號整數(shù)的阿爾法乘積。對于一個無符號整數(shù)x來說,它的阿爾法乘積是這樣來計算的:如果x是一個個位數(shù),那么它的阿爾法乘積就是它本身;否則的話,x的阿爾法乘積就等于它的各位非0的數(shù)字相乘所得到的那個整數(shù)的阿爾法乘積。例如,4018224312的阿爾法乘積等于8,它是經(jīng)過以下的幾個步驟計算出來的:
4018224312à4*1*8*2*2*4*3*1*2à3072
3072à3*7*2à42
42à4*2à8
輸入:
4018224312
輸出:
8
水
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #include<cmath>typedef long long ll; using namespace std; int main() {unsigned long long n;cin>>n;while(n/10){unsigned long long k=n;n=1;while(k){if(k%10){n*=(k%10); } k/=10;}}cout<<n<<endl;return 0;}下一題沒寫,看著有點(diǎn)麻煩,應(yīng)該不是很難
?
5. 數(shù)組A中共有n個元素,初始全為0。你可以對數(shù)組進(jìn)行兩種操作:1、將數(shù)組中的一個元素加1;2、將數(shù)組中所有元素乘2。求將數(shù)組A從初始狀態(tài)變?yōu)槟繕?biāo)狀態(tài)B所需要的最少操作數(shù)。
輸入格式
第一行一個正整數(shù)n表示數(shù)組中元素的個數(shù)
第二行n個正整數(shù)表示目標(biāo)狀態(tài)B中的元素
輸出格式
輸出一行表示最少操作數(shù)
樣例輸入
2
7 8
樣例輸出
7
數(shù)據(jù)規(guī)模和約定
n<=50,B[i]<=1000
逆向思維
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #include<cmath>typedef long long ll; using namespace std; int a[55]; int main() {int n;cin>>n;for(int t=0;t<n;t++){scanf("%d",&a[t]);}int flag=0;ll s=0;while(flag==0){int flag1=0;for(int t=0;t<n;t++){if(a[t]%2==1){a[t]--;s++;flag1=1;}}if(flag1==0){for(int t=0;t<n;t++){a[t]/=2;}s++;}int cnt=0;for(int t=0;t<n;t++){if(a[t]==0){cnt++;}}if(cnt==n){flag=1;}}cout<<s<<endl;return 0; } 6.Anagrams指的是具有如下特性的兩個單詞:在這兩個單詞當(dāng)中,每一個英文字母(不區(qū)分大小寫)所出現(xiàn)的次數(shù)都是相同的。例如,Unclear和Nuclear、Rimon和MinOR都是Anagrams。編寫一個程序,輸入兩個單詞(只包含英文字母),然后判斷一下,這兩個單詞是否是Anagrams。每一個單詞的長度不會超過80個字符,而且是大小寫無關(guān)的。
Input:長度不超過80個字符的兩個單詞,用空格隔開,不考慮字母大小寫 (大小寫無關(guān))
Output: yes或者no
輸入:
Rimon MinOR
輸出:
yes?
一眼題不解釋
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #include<cmath>typedef long long ll; using namespace std; char str1[85],str2[85]; int vis1[100]; int vis2[100]; int main() {scanf("%s",str1);scanf("%s",str2);int len1=strlen(str1);int len2=strlen(str2);for(int t=0;t<len1;t++){if(str1[t]>='A'&&str1[t]<='Z'){str1[t]=tolower(str1[t]);}}for(int t=0;t<len2;t++){if(str2[t]>='A'&&str2[t]<='Z'){str2[t]=tolower(str2[t]);}}for(int t=0;t<len1;t++){vis1[str1[t]-'a']++;}for(int t=0;t<len2;t++){vis2[str2[t]-'a']++;}int flag=1;for(int t=0;t<26;t++){if(vis1[t]!=vis2[t]){flag=0;} }if(flag){cout<<"yes"<<endl;}else{cout<<"no"<<endl;}return 0; } 7.輸入一個正整數(shù)n,輸出n!的值。
其中n!=1*2*3*…*n。
算法描述
n!可能很大,而計算機(jī)能表示的整數(shù)范圍有限,需要使用高精度計算的方法。使用一個數(shù)組A來表示一個大整數(shù)a,A[0]表示a的個位,A[1]表示a的十位,依次類推。
將a乘以一個整數(shù)k變?yōu)閷?shù)組A的每一個元素都乘以k,請注意處理相應(yīng)的進(jìn)位。
首先將a設(shè)為1,然后乘2,乘3,當(dāng)乘到n時,即得到了n!的值。
輸入格式
輸入包含一個正整數(shù)n,n<=1000。
輸出格式
輸出n!的準(zhǔn)確值。
樣例輸入
10
樣例輸出
3628800
高精度
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define LL long longusing namespace std; /* * 完全大數(shù)模板 * 輸出cin>>a * 輸出a.print(); * 注意這個輸入不能自動去掉前導(dǎo)0的,可以先讀入到char數(shù)組,去掉前導(dǎo)0,再用構(gòu)造函數(shù)。 */ #define MAXN 9999 #define MAXSIZE 1010 #define DLEN 4 class BigNum { private:int a[5000]; //可以控制大數(shù)的位數(shù)int len; public:BigNum() {len=1; //構(gòu)造函數(shù)memset(a,0,sizeof(a));}BigNum(const int); //將一個int類型的變量轉(zhuǎn)化成大數(shù)BigNum(const char*); //將一個字符串類型的變量轉(zhuǎn)化為大數(shù)BigNum(const BigNum &); //拷貝構(gòu)造函數(shù)BigNum &operator=(const BigNum &); //重載賦值運(yùn)算符,大數(shù)之間進(jìn)行賦值運(yùn)算friend istream& operator>>(istream&,BigNum&); //重載輸入運(yùn)算符friend ostream& operator<<(ostream&,BigNum&); //重載輸出運(yùn)算符BigNum operator+(const BigNum &)const; //重載加法運(yùn)算符,兩個大數(shù)之間的相加運(yùn)算BigNum operator-(const BigNum &)const; //重載減法運(yùn)算符,兩個大數(shù)之間的相減運(yùn)算BigNum operator*(const BigNum &)const; //重載乘法運(yùn)算符,兩個大數(shù)之間的相乘運(yùn)算BigNum operator/(const int &)const; //重載除法運(yùn)算符,大數(shù)對一個整數(shù)進(jìn)行相除運(yùn)算BigNum operator^(const int &)const; //大數(shù)的n次方運(yùn)算int operator%(const int &)const; //大數(shù)對一個int類型的變量進(jìn)行取模運(yùn)算bool operator>(const BigNum &T)const; //大數(shù)和另一個大數(shù)的大小比較bool operator>(const int &t)const; //大數(shù)和一個int類型的變量的大小比較void print(); //輸出大數(shù) }; BigNum::BigNum(const int b) //將一個int類型的變量轉(zhuǎn)化為大數(shù) {int c,d=b;len=0;memset(a,0,sizeof(a));while(d>MAXN) {c=d-(d/(MAXN+1))*(MAXN+1);d=d/(MAXN+1);a[len++]=c;}a[len++]=d; } BigNum::BigNum(const char *s) //將一個字符串類型的變量轉(zhuǎn)化為大數(shù) {int t,k,index,L,i;memset(a,0,sizeof(a));L=strlen(s);len=L/DLEN;if(L%DLEN)len++;index=0;for(i=L-1; i>=0; i-=DLEN) {t=0;k=i-DLEN+1;if(k<0)k=0;for(int j=k; j<=i; j++)t=t*10+s[j]-'0';a[index++]=t;} } BigNum::BigNum(const BigNum &T):len(T.len) //拷貝構(gòu)造函數(shù) {int i;memset(a,0,sizeof(a));for(i=0; i<len; i++)a[i]=T.a[i]; } BigNum & BigNum::operator=(const BigNum &n) //重載賦值運(yùn)算符,大數(shù)之間賦值運(yùn)算 {int i;len=n.len;memset(a,0,sizeof(a));for(i=0; i<len; i++)a[i]=n.a[i];return *this; } istream& operator>>(istream &in,BigNum &b) {char ch[MAXSIZE*4];int i=-1;in>>ch;int L=strlen(ch);int count=0,sum=0;for(i=L-1; i>=0;) {sum=0;int t=1;for(int j=0; j<4&&i>=0; j++,i--,t*=10) {sum+=(ch[i]-'0')*t;}b.a[count]=sum;count++;}b.len=count++;return in; } ostream& operator<<(ostream& out,BigNum& b) //重載輸出運(yùn)算符 {int i;cout<<b.a[b.len-1];for(i=b.len-2; i>=0; i--) {printf("%04d",b.a[i]);}return out; } BigNum BigNum::operator+(const BigNum &T)const //兩個大數(shù)之間的相加運(yùn)算 {BigNum t(*this);int i,big;big=T.len>len?T.len:len;for(i=0; i<big; i++) {t.a[i]+=T.a[i];if(t.a[i]>MAXN) {t.a[i+1]++;t.a[i]-=MAXN+1;}}if(t.a[big]!=0)t.len=big+1;else t.len=big;return t; } BigNum BigNum::operator-(const BigNum &T)const //兩個大數(shù)之間的相減運(yùn)算 {int i,j,big;bool flag;BigNum t1,t2;if(*this>T) {t1=*this;t2=T;flag=0;} else {t1=T;t2=*this;flag=1;}big=t1.len;for(i=0; i<big; i++) {if(t1.a[i]<t2.a[i]) {j=i+1;while(t1.a[j]==0)j++;t1.a[j--]--;while(j>i)t1.a[j--]+=MAXN;t1.a[i]+=MAXN+1-t2.a[i];} else t1.a[i]-=t2.a[i];}t1.len=big;while(t1.a[t1.len-1]==0 && t1.len>1) {t1.len--;big--;}if(flag)t1.a[big-1]=0-t1.a[big-1];return t1; } BigNum BigNum::operator*(const BigNum &T)const //兩個大數(shù)之間的相乘 {BigNum ret;int i,j,up;int temp,temp1;for(i=0; i<len; i++) {up=0;for(j=0; j<T.len; j++) {temp=a[i]*T.a[j]+ret.a[i+j]+up;if(temp>MAXN) {temp1=temp-temp/(MAXN+1)*(MAXN+1);up=temp/(MAXN+1);ret.a[i+j]=temp1;} else {up=0;ret.a[i+j]=temp;}}if(up!=0)ret.a[i+j]=up;}ret.len=i+j;while(ret.a[ret.len-1]==0 && ret.len>1)ret.len--;return ret; } BigNum BigNum::operator/(const int &b)const //大數(shù)對一個整數(shù)進(jìn)行相除運(yùn)算 {BigNum ret;int i,down=0;for(i=len-1; i>=0; i--) {ret.a[i]=(a[i]+down*(MAXN+1))/b;down=a[i]+down*(MAXN+1)-ret.a[i]*b;}ret.len=len;while(ret.a[ret.len-1]==0 && ret.len>1)ret.len--;return ret; } int BigNum::operator%(const int &b)const //大數(shù)對一個 int類型的變量進(jìn)行取模 {int i,d=0;for(i=len-1; i>=0; i--)d=((d*(MAXN+1))%b+a[i])%b;return d; } BigNum BigNum::operator^(const int &n)const //大數(shù)的n次方運(yùn)算 {BigNum t,ret(1);int i;if(n<0)exit(-1);if(n==0)return 1;if(n==1)return *this;int m=n;while(m>1) {t=*this;for(i=1; (i<<1)<=m; i<<=1)t=t*t;m-=i;ret=ret*t;if(m==1)ret=ret*(*this);}return ret; } bool BigNum::operator>(const BigNum &T)const //大數(shù)和另一個大數(shù)的大小比較 {int ln;if(len>T.len)return true;else if(len==T.len) {ln=len-1;while(a[ln]==T.a[ln]&&ln>=0)ln--;if(ln>=0 && a[ln]>T.a[ln])return true;elsereturn false;} elsereturn false; } bool BigNum::operator>(const int &t)const //大數(shù)和一個int類型的變量的大小比較 {BigNum b(t);return *this>b; } void BigNum::print() //輸出大數(shù) {int i;printf("%d",a[len-1]);for(i=len-2; i>=0; i--)printf("%04d",a[i]); // printf("\n"); }int main() {BigNum a;int n;cin>>n;a="1";int t;for(t=1;t<=n;t++){BigNum s=t;a=a*s;}a.print();return 0; }8.如果有人認(rèn)為吃東西只需要嘴巴,那就錯了。
都知道舌頭有這么一個特性,“由簡入奢易,由奢如簡難”(據(jù)好事者考究,此規(guī)律也適合許多其他情況)。具體而言,如果是甜食,當(dāng)你吃的食物不如前面剛吃過的東西甜,就很不爽了。
大寶是一個聰明的美食家,當(dāng)然深諳此道。一次他來到某小吃一條街,準(zhǔn)備從街的一頭吃到另一頭。為了吃得爽,他大費(fèi)周章,得到了各種食物的“美味度”。他拒絕不爽的經(jīng)歷,不走回頭路而且還要爽歪歪(爽的次數(shù)盡量多)。
輸入格式
兩行數(shù)據(jù)。
第一行為一個整數(shù)n,表示小吃街上小吃的數(shù)量
第二行為n個整數(shù),分別表示n種食物的“美味度”
輸出格式
一個整數(shù),表示吃得爽的次數(shù)
樣例輸入
10
3 18 7 14 10 12 23 41 16 24
樣例輸出
6
數(shù)據(jù)規(guī)模和約定
美味度為0到100的整數(shù)
n<1000
最長上升子序列的稍微不同,不必嚴(yán)格大于,可以等于
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #include<cmath>typedef long long ll; using namespace std; int a[1005],dp[1005]; int n,ans=-999; int main() {scanf("%d",&n);for(int i=1;i<=n;i++) {scanf("%d",&a[i]);dp[i]=1;}for(int i=1;i<=n;i++)for(int j=1;j<i;j++)if(a[j]<=a[i]) dp[i]=max(dp[i],dp[j]+1);for(int i=1;i<=n;i++) ans=max(ans,dp[i]);printf("%d\n",ans);return 0; }?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/Staceyacm/p/10781792.html
總結(jié)
以上是生活随笔為你收集整理的蓝桥训练1-3,5-8题解(自己写的,过了蓝桥官网的数据)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 06. 用css实现三角形
- 下一篇: python学习笔记四-列表