《算法笔记》 第三章3.5节、3.6节学习笔记

《算法笔记》 第三章学习笔记

编译环境:codeblocks20.03
备注:本文留作作者自用,如有错误敬请指出

3.5节
【PAT B1022】

#include<cstdio>//直接用除基取余法
int main()
{
    int a,b,d;
    scanf("%d %d %d",&a,&b,&d);
    a+=b;
    int z[40],num=0;
    do{
        z[num++]=a%d;
        a/=d;
    }while(a);
    for(int i=num-1;i>=0;--i){
        printf("%d",z[i]);
    }
 	return 0;
}

【PAT B1037】

#include<cstdio>
int main()
{
    int g1,s1,k1,g2,s2,k2;
    scanf("%d.%d.%d",&g1,&s1,&k1);
    scanf("%d.%d.%d",&g2,&s2,&k2);
    k1=17*29*g1+29*s1+k1;
    k2=17*29*g2+29*s2+k2;
    int g,s,k;
    if(k1>k2) k=k1-k2;//钱不够的情况
    else k=k2-k1;
    g=k/(17*29);s=k%(17*29)/29;
    k=k-17*29*g-29*s;
    if(k1>k2) g=-g;
    printf("%d.%d.%d",g,s,k);
 	return 0;
}

【PAT A1019】

#include<cstdio>
int main()
{
   int n,b;
   scanf("%d %d",&n,&b);
   int z[40],num=0;
   do{
    z[num++]=n%b;
    n/=b;
   }while(n);
   if(!(num-1)) printf("Yes\n%d",z[0]);//个位数也是回文数
   else {
    int flag=0;//flag为1则不是回文数
    for(int i=0;i<num/2;++i){
        if(z[i]!=z[num-1-i]) {
                flag=1;
                break;
        }
    }
    if(flag) printf("No\n");
    else printf("Yes\n");
    for(int i=num-1;i>=0;--i){
        printf("%d",z[i]);
        if(i) printf(" ");
    }
   }
 	return 0;
}

【PAT A1027】

#include<cstdio>
char radix[13]={'0','1','2','3','4','5',
                '6','7','8','9','A','B','C'};
int main()
{
   int r,g,b;
   scanf("%d %d %d",&r,&g,&b);
   printf("#");
   printf("%c%c",radix[r/13],radix[r%13]);
   printf("%c%c",radix[g/13],radix[g%13]);
   printf("%c%c",radix[b/13],radix[b%13]);
 	return 0;
}

3.6节
【codeup 5901】

#include<cstdio>//自己运行没问题,就是通过不了,无语
#include<cstring>
int judge(char s[]) {
    int n = strlen(s);
    for (int i = 0; i < n / 2; ++i) {
        if (s[i] != s[n - 1 - i])
            return 0;
    }
    return 1;
}
int main()
{
    char str[256];
    while (gets_s(str)) {//gets()函数疑似不能用了
        int flag = judge(str);
        if (flag) printf("Yes");
        else printf("No");
    }
    return 0;
}

【PATB1009】

#include<cstdio>
#include<iostream>
#include<string>
using std::cin;
using std::string;
using std::cout;
int main()
{
    string str[80];
    int cnt = 0;
    while (cin >> str[cnt]) {
        cnt++;
    }
    while (cnt--) {
        cout << str[cnt];
        if (cnt) printf(" ");
    }
    return 0;
}

【PAT B1006】

#include<cstdio>
int main()
{
  int a;
  scanf("%d",&a);
  int b,s,n;
  b=a/100;
  s=(a-100*b)/10;
  n=a-100*b-10*s;
  for(int i=0;i<b;++i)//输出换格式后的百位部分
    printf("B");
  for(int i=0;i<s;++i)//输出换格式后的十位部分
    printf("S");
   for(int i=1;i<n+1;++i)//输出换格式后的个位部分
       printf("%d",i);
 	return 0;
}

【PATB1021】

#include<cstdio>
#include<cstring>
char str[1001];
int cnt[10];
int main()
{
  int n=0;
  scanf("%s",str);//用字符串存储输入的整数
  for(int i=0;i<strlen(str);++i){
    if(cnt[str[i]-48]) n++;//n用于计数输出的行数
    cnt[str[i]-48]++;//数字与其字符的ASCII码值相差48
  }                  //书上减去的‘0’的ASCII码值就是48
  for(int i=0;i<10;++i){
    if(cnt[i]) printf("%d:%d",i,cnt[i]);
    else continue;
    if(n) printf("\n");//结尾无空行,好像有也无影响
  }
 	return 0;
}

【PATB1002】

#include<cstdio>
#include<cstring>
char num[10][5] = { "ling","yi","er","san",
"si","wu","liu","qi","ba","jiu" };
int main()
{
 char Int[101] = "";
 scanf("%s",Int);
 int sum = 0;
 for (int i = 0; i < strlen(Int); ++i) {
 sum += (Int[i] - '0');
 }
 if (sum > 99) {//sum不会超过三位数,就直接列举出来了
        printf("%s ",num[sum / 100]);
        sum %= 100;
        printf("%s ",num[sum / 10]);
        sum %= 10;
        printf("%s",num[sum]);
    }
 else if (sum > 9) {
    printf("%s ",num[sum / 10]);
        sum %= 10;
        printf("%s",num[sum]);
 }
 else printf("%s",num[sum]);
return 0;
}

【PATB1014】

#include<cstdio>//边界处理实在是太麻烦了
#include<cstring>
#include<cctype>
char a[70], b[70], c[70], d[70];
char week[7][5] = { "MON","TUE",
"WED","THU","FRI","SAT","SUN" };
int main()
{
    scanf("%s %s %s %s", a, b, c, d);
    int flag = 0;
    for (int i = 0; i < strlen(a)&&i < strlen(b); ++i) {
        if (!flag) {//说明在找第一对字符
            if (!isupper(a[i])) continue;//a[i]不是大写字母时
            else if ((a[i] == b[i])&&a[i]<72) {//a[i]=b[i]且值在A、G之间
                printf("%s ", week[a[i] - 65]);//打印星期几
                flag = 1;//标志着找到第一对字符
                continue;
            }
        }
        else {//说明在找第二对字符
            if (((64<a[i]&&a[i]<79)|| isdigit(a[i])) && (a[i] == b[i]) ){
                printf("%02d", (isalpha(a[i]) ? a[i] - 55 : a[i] - 48));
                    break;
            }
        }
    }
    for (int i = 0; i < strlen(c) &&i< strlen(d) ; ++i) {
        if (isalpha(c[i]) && (c[i] == d[i])) {//满足第三对字符的条件时
            printf(":%02d", i);
                break;
        }
    }
    return 0;
}

【PATB1024】

#include<cstdio>
#include<cstring>

int main()
{
  char sci[10000]={};
  scanf("%s",sci);
  int len=strlen(sci);
  if(sci[0]=='-') printf("-");
  int pos=0;
  while(sci[pos]!='E') pos++;
  int exp=0;
  for(int i=pos+2;i<len;++i){
    exp=exp*10+(sci[i]-'0');
  }
  if(exp==0){//特判指数为0的情况
    for(int i=1;i<pos;++i)
        printf("%c",sci[i]);
  }
 if(sci[pos+1]=='-'){
    printf("0.");
    for(int i=0;i<exp-1;++i)
        printf("0");
    printf("%c",sci[1]);
    for(int i=3;i<pos;++i){
        printf("%c",sci[i]);
    }
 }else{
     for(int i=1;i<pos;++i){
        if(sci[i]=='.') continue;
        printf("%c",sci[i]);
        if(i==exp+2 &&pos-3!=exp)
            printf(".");
     }
     for(int i=0;i<exp-(pos-3);++i)
        printf("0");
 }
 	return 0;
}

【PATB1048】

#include<cstdio>//想复杂了
#include<cstring>
char remain[]={'0','1','2','3','4',
'5','6','7','8','9','J','Q','K'};
int main()
{
    char a[110]={},b[110]={},an[110]={},bn[110]={};
    scanf("%s %s",an,bn);
    int len1=strlen(an),len2=strlen(bn);
    if(len1<len2){
     for(int i=len2-1,k=len1-1;i>=0;--i,--k){
        if(k>=0) a[i]=an[k];
        else a[i]='0';
     }
        for(int i=0;i<len2;++i)
            b[i]=bn[i];
    }else{
      for(int i=len1-1,k=len2-1;i>=0;--i,--k){
        if(k>=0) b[i]=bn[k];
        else b[i]='0';
     }
        for(int i=0;i<len1;++i)
            a[i]=an[i];
    }
    int j=0;
    int len=(len1<len2?len2:len1);
    char result[110]={};
    if(len%2!=0){
     for(int i=len-1;i>=0;--i){
         if(i%2==0)
            result[j++]=remain[(a[i]-'0'+b[i]-'0')%13];
         else{
             int x=b[i]-a[i];
            result[j++]=(x<0?x+10:x)+'0';
         }
      }
     }else{
         for(int i=len-1;i>=0;--i){
         if(i%2!=0)
            result[j++]=remain[(a[i]-'0'+b[i]-'0')%13];
         else{
             int x=b[i]-a[i];
            result[j++]=(x<0?x+10:x)+'0';
         }
      }
     }
   for(int i=j-1;i>=0;i--)
                   printf("%c",result[i]);
    return 0;
}

【PATA1001】

#include<cstdio>//不理解为什么放在字符串处理这一节下,害我走了弯路
int num[10];
int main()
{
  int a,b;
  scanf("%d %d",&a,&b);
  int sum=a+b;
  if(sum<0){
    printf("-");
    sum=-sum;
  }
  int len=0;
  if(sum==0) num[len++]=0;
  while(sum){
    num[len++]=sum%10;
    sum/=10;
  }
  for(int k=len-1;k>=0;--k){
    printf("%d",num[k]);
    if(k>0&&k%3==0) printf(",");
  }
    return 0;
}

【PATA1005】

#include<cstdio>
#include<cstring>
#include<vector>
char digit[][10]={"zero","one","two","three",
"four","five","six","seven","eight","nine"};
int main()
{
   char a[111];//一开始用long long存储有答案错误,后来发现是因为空间不够
   scanf("%s",a);
   if(a[0]!='0'){
    int sum=0;//各位数字的总和
	for(int i=0;i<strlen(a);++i){
		sum+=(a[i]-'0');//别忘了ASCII码值和数值的转换
	}
    std::vector<int> b;//逆序存储sum的各位数据
    int cnt=0;
    while(sum){
      b.push_back(sum%10);
      sum/=10;
      cnt++;
    }
    for(int i=cnt-1;i>=0;--i){
        printf("%s",digit[b[i]]);
        if(i!=0) printf(" ");
     }
   }else printf("zero");//特解为0的情况
   return 0;
}

【PATA1035】

#include<cstdio>
#include<cstring>
char name[1010][11],pass[1010][11];//分别用于存储用户名和对应的密码
int flag[1010];
int main()
{
  int n;
  scanf("%d",&n);
  int cop=n;
  for(int i=0;i<n;++i){
    scanf("%s %s",name[i],pass[i]);
  }
  int cnt=0;
  for(int i=0;i<n;++i){//遍历密码
    for(int j=0;j<11;++j){
        if(pass[i][j]=='1') {pass[i][j]='@';flag[i]++;}
        else if(pass[i][j]=='0') {pass[i][j]='%';flag[i]++;}
        else if(pass[i][j]=='O') {pass[i][j]='o';flag[i]++;}
        else if(pass[i][j]=='l') {pass[i][j]='L';flag[i]++;}
    }
    if(flag[i]) cnt++;
  }
  if(!cnt) {
      if(n!=1)
         printf("There are %d accounts and no account is modified",n);
      else printf("There is 1 account and no account is modified");
  }
  else{ printf("%d\n",cnt);
   for(int i=0;i<n;++i){
     if(flag[i]) {
            printf("%s %s",name[i],pass[i]);
            cnt--;
            if(cnt) printf("\n");
        }
    }
 }
  return 0;
}

【PATA1077】

#include<cstdio>
#include<cstring>
#include<iostream>
using std::cin;
char s[110][260];
int main()
{ int ans=0;
  int n;
  int min=256;
  scanf("%d",&n);
  getchar();
  for(int i=0;i<n;++i){
    cin.getline(s[i],260);//代替了get函数
    int len=strlen(s[i]);
    if(min>len) min=len;
    for(int j=0;j<len/2;++j){
        char temp=s[i][j];
        s[i][j]=s[i][len-j-1];
        s[i][len-j-1]=temp;
    }
  }
 for(int i=0;i<min;++i){
    char c=s[0][i];
    bool same=true;
    for(int j=1;j<n;++j){
        if(c!=s[j][i]){
            same=false;
            break;
        }
    }
    if(same) ans++;
    else break;
 }
 if(ans){
    for(int i=ans-1;i>=0;--i)
        printf("%c",s[0][i]);
 }else printf("nai");
  return 0;
}

【PATA1082】
不会写先空着😅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值