算法笔记 第三章
目錄
- B1001 害死人不償命的(3n+1)猜想
- B1032 挖掘機技術哪家強
- 問題B: 找X
- B1036 跟奧巴馬一起編程
- 問題 A: 日期差值
- 進制轉換
- B1022 D進制的A+B
- 問題 I: 【字符串】回文串
- B1009 說反話
B1001 害死人不償命的(3n+1)猜想
代碼:
B1032 挖掘機技術哪家強
代碼:
問題B: 找X
代碼:
進一步的優化
#include<cstdio> int a[205]; int main(void) {int n;int i;int x;while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++){scanf("%d",&a[i]);}scanf("%d",&x);for(i=0;i<n;i++){if(x==a[i]){printf("%d\n",i);break;} }if(i==n){printf("-1\n");} }return 0; }B1036 跟奧巴馬一起編程
問題分析: 當列數是偶數時,行數等于列數的一半。 當列數是奇數時,行數等于列數的一半再加1。代碼
#include<cstdio> int main(void) {int n,i,j;int lie;//空格列的個數int hang;//空格行的個數char a;scanf("%d %c",&n,&a);for(i=1;i<=n;i++){printf("%c",a);}lie=n-2;if(n%2==0)hang=n/2;elsehang=n/2+1;printf("\n");hang=hang-2;for(i=1;i<=hang;i++){printf("%c",a);for(j=1;j<=lie;j++)printf(" ");printf("%c\n",a);}for(i=1;i<=n;i++){printf("%c",a);}return 0; }問題 A: 日期差值
問題分析: 先假設第一個日期大(如果不是就互換) 讓第一個的日期一直加1直到等于第二個日期。 為了方便直接取出每個月的天數,不妨給定一個二維數組int month[13][2],用來存放 每個月的天數,其中第二維為0時表示平年,為1時表示閏年。代碼如下:
#include<cstdio> int month[13][2]= {{0,0},//當二維為0時代表平年,當二維為1時代表潤年, {31,31},//一月 {28,29},//二月 {31,31},//3{30,30},//4{31,31},//5{30,30},//6{31,31},//7{31,31},//8{30,30},//9{31,31},//10{30,30},//11{31,31}//12 }; bool panduan(int year) {return (year%4==0 && year%100!=0) || (year%400==0); } int main(void) {int temp;int a1,a2;int y1,m1,d1;int y2,m2,d2;while( scanf("%d %d",&a1,&a2) != EOF ){if(a1>a2){temp=a2;a2=a1;a1=temp;}temp=1;y1=a1/10000;m1=(a1/100)%100;d1=a1%100;y2=a2/10000;m2=(a2/100)%100;d2=a2%100;//while( y1!=y2 || m1!=m2 || d1!=d2 )while( y1<y2 || m1<m2 || d1<d2 ){d1++;if(d1==month[m1][panduan(y1)]+1){m1++;d1=1;}if(m1==13){y1++;m1=1;}temp++;}printf("%d\n",temp);}return 0; }如果想提升運行速度,只需把第一個的年份不斷加1,直到與第二個日期的年份相差為1。
天數按照平/閏年的天數來加365或366。
年份相差為1是因為第一個日期的月日可能比第二個日期的月日大。
代碼如下:
進制轉換
題目:對于一個P進制的數,如果要轉換為Q進制。
分為兩步:
代碼如下:
B1022 D進制的A+B
代碼如下:
或者這樣更好
#include<cstdio> int main(void) {int A,B,D,sum,i;int a[100]={0};scanf("%d%d%d",&A,&B,&D);sum=A+B;i=0;do{a[i++]=sum%D;sum=sum/D;}while(sum!=0);i--;for(;i>=0;i--){printf("%d",a[i]);}return 0; }問題 I: 【字符串】回文串
代碼如下:
B1009 說反話
方法一
方法二:
#include<stdio.h> #include<string.h> int main(void) {int num=0;int i,h;char a[90];char ans[90][90];gets(a);for(i=0;i<strlen(a);i++){if(a[i]!=' '){ans[num][h++]=a[i];}else{ans[num][h]='\0';num++;h=0;}}for(i=num;i>=0;i--){printf("%s",ans[i]);if(i>0)printf(" ");}return 0; }總結
- 上一篇: 用构造函数来完成结构体的初始化
- 下一篇: 【C/C++】排序算法