日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法笔记 第三章

發布時間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法笔记 第三章 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • B1001 害死人不償命的(3n+1)猜想
  • B1032 挖掘機技術哪家強
  • 問題B: 找X
  • B1036 跟奧巴馬一起編程
  • 問題 A: 日期差值
  • 進制轉換
  • B1022 D進制的A+B
  • 問題 I: 【字符串】回文串
  • B1009 說反話

B1001 害死人不償命的(3n+1)猜想


代碼:

#include<cstdio> int main(void) {int n;int temp=0;scanf("%d",&n);while(n!=1){if(n%2==0){n=n/2;temp++;continue;}n=(n*3+1)/2;temp++;}printf("%d\n",temp);return 0; }

B1032 挖掘機技術哪家強


代碼:

#include<cstdio> int school[100005]; int main(void) {int n,sch,number;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d %d",&sch,&number);school[sch]+=number;}int max_x,max;max=-1;for(int i=1;i<=n;i++){if(school[i]>max){max_x=i;max=school[i];}}printf("%d %d",max_x,max);return 0; }

問題B: 找X


代碼:

#include<cstdio> int a[205]; int main(void) {int n;int i;int x;int x_x;int temp;while(scanf("%d",&n)!=EOF){temp=0;for(i=0;i<n;i++){scanf("%d",&a[i]);}scanf("%d",&x);for(i=0;i<n;i++){if(x==a[i]){x_x=i;temp=1;printf("%d\n",x_x);break;} }if(!temp){printf("-1\n");} }return 0; }

進一步的優化

#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是因為第一個日期的月日可能比第二個日期的月日大。
代碼如下:

#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-1)) //提升速度{if(panduan(y1))temp+=366;elsetemp+=365;y1++;}//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; }

進制轉換

題目:對于一個P進制的數,如果要轉換為Q進制。
分為兩步:

  • 將P進制數x轉換成為十進制數y
  • 將十進制數y轉換成Q進制數z
    代碼如下:
  • #include<cstdio> int main(void) {int P,Q,x;int x_D=0;int x_Q[30]={0};int product=1;int i=0;printf("請輸入P:");scanf("%d",&P);printf("請輸入x:");scanf("%d",&x);printf("請輸入Q:");scanf("%d",&Q);while(x!=0){x_D=x_D+(x%10)*product;x=x/10;product=product*P; }printf("%d\n",x_D);while(x_D!=0){x_Q[i]=x_D%Q;x_D/=Q;i++; }for(;i>=0;i--){printf("%d",x_Q[i]);}return 0; }

    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;if(sum==0){printf("0\n");return 0;}while(sum!=0){a[i++]=sum%D;sum=sum/D;}i--;for(;i>=0;i--){printf("%d",a[i]);}return 0; }

    或者這樣更好

    #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: 【字符串】回文串


    代碼如下:

    #include<cstdio> #include<cstring>> bool judge(char a[],int len) {int i=0;for(i=0;i<len/2;i++){if(a[i]!=a[len-1-i])return false;}return true; } int main(void) {char a[256];gets(a);if(judge(a,strlen(a)))printf("YES\n");elseprintf("NO\n");return 0; }

    B1009 說反話


    方法一

    #include<cstdio> int main(void) {int num=0;char ans[90][90];while( scanf("%s",ans[num]) != EOF ){num++;} for(int i=num-1;i>=0;i--){printf("%s",ans[i]);if(i>0)printf(" ");}return 0; }

    方法二:

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

    總結

    以上是生活随笔為你收集整理的算法笔记 第三章的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。