《算法笔记》 第三章学习笔记
编译环境: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】
不会写先空着😅