刷题笔记day2
【PAT A1001】 A+B Format
#include<stdio.h> #include<string.h> int main() { int a,b,flag; int c; scanf("%d%d",&a,&b); c = a + b; if(c < 0) flag = -1; else flag = 1; c *= flag; char str[1000]; char ans[1000]; int ccount = 0; sprintf(str,"%d",c); int len = strlen(str); for(int i=len-1;i>=0;i--) { if((len-i-1) % 3 == 0 && i != len-1) ans[ccount++] = ','; ans[ccount++] = str[i]; } if(flag == -1) printf("-"); for(int j=ccount-1;j>=0;j--) printf("%c",ans[j]); printf("\n"); }
【PAT 1002】 A+B for Polynomials
#include<stdio.h> #include<string.h> double c[1005]; int main() { memset(c,0,sizeof(c)); int k1,k2; int zhi; double xi; scanf("%d",&k1); for(int i=0;i<k1;i++) { scanf("%d%lf",&zhi,&xi); c[zhi] += xi; } scanf("%d",&k2); for(int j=0;j<k2;j++) { scanf("%d%lf",&zhi,&xi); c[zhi] += xi; } int ccount = 0; for(int k=0;k<1005;k++) { if(c[k] != 0) { ccount++; } } printf("%d",ccount); for(int kk=1004;kk>=0;kk--) { if(c[kk] != 0) { printf(" %d %.1lf",kk,c[kk]); } } printf("\n"); }
计算n!的末尾有多少个零。
即计算n!中以5为质因子的个数。
//计算质因子 //cal(n,5) int cal(int n.int p) { int ans = 0; while(n) { ans += n/p; n /= p; } return ans; }
计算组合数C(n,m)
//o(m)计算组合数 long long C(long long n,long long m) { long long ans = 1; for(long long i = 1; i <= m;i++) { ans = ans* (n - m + i)/i; } return ans; }
自测-1 打印沙漏
此题的坑点在于题目没有叙述,某一行输出符号之后是空格还是直接下一行。一开始是每行打印2k+1字符,格式错误。后来改成不输出符号后的空格,即通过。
pta平台不会忽略输出行之后的空格。
#include<stdio.h> int main() { int n; char c = '*'; int r; scanf("%d %c",&n,&c); //2k*k-1 int k; for(k=1;2*k*k-1<=n;k++) { } k--; //printf("k: %d\n",k); r = n - 2*k*k + 1; int i,j; for(i=k;i>0;i--) { for(j=0;j<2*k-1;j++) { if(j<k-i ) printf(" "); else if(j>2*k-1-k+i-1) break; else printf("%c",c); } printf("\n"); } for(i=1;i<k;i++) { for(j=0;j<2*k-1;j++) { if(j<k-i-1 ) printf(" "); else if( j>2*k-1-k+i) break; else printf("%c",c); } printf("\n"); } printf("%d",r); }
自测-2 素数对猜想
使用了欧拉素筛,不知道暴力是否会超时。
#include<stdio.h> int isp[100005]={0}; int main() { int n; scanf("%d",&n); int i; for(i=2;i<100005;i++) { if(isp[i]==0) for(int j = i+i;j<100005;j+=i) { isp[j] = 1; } } int ccount = 0; int left = 2; int right = 3; for(i=4;i<n+1;i++) { if(isp[i] == 0) { //printf("i:%d\n",i); left = right; right = i; if(right - left == 2) ccount++; } } printf("%d\n",ccount); }
自测-4 Have Fun with Numbers
由于超过了unsigned long long的范围,需要使用高精度加法。
#include<stdio.h> #include<string.h> int num[11]; int ans[11]; char temp[21]; char str[21]; int s=0; int c[21]; int main() { int exist = -1; memset(num,0,sizeof(num)); memset(ans,0,sizeof(ans)); scanf("%s",temp); int len = strlen(temp); for(int i=len-1;i>=0;i--) { int t = temp[i] - '0'; num[t]++; str[s++] = temp[i]; } int carry = 0; for(int j=0;j<s;j++) { //printf("%c",str[j]); carry = (str[j]-'0')*2 + carry; c[j] = carry % 10; carry /= 10; } if(carry!=0) { c[s++] = carry; exist = 0; } //printf("exist:%d\n",exist); if(exist == 0) { printf("No"); } else if(exist == -1) { //ans[] for(int q=0;q<s;q++) { ans[c[q]]++; } for(int p=0;p<11;p++) { if(ans[p]!=num[p]) { //printf("ans[%d]%d!=num[%d]%d",p,ans[p],p,num[p]); exist = 1; break; } } if(exist == 1) printf("No"); else printf("Yes"); } printf("\n"); for(int k=s-1;k>=0;k--) { printf("%d",c[k]); } printf("\n"); }
自测-5 Shuffling Machine
模拟洗牌算法的实现过程。
#include<stdio.h> char str[55]; int snum[55]; int main() { int time; int a[55]; scanf("%d",&time); for(int i=1;i<=54;i++) { scanf("%d",&a[i]); } int num; for(int j=1;j<=54;j++) { int temp = time; num = j; while(temp--) { num = a[num]; } if(j>=1 && j<=13) { str[num] = 'S'; snum[num] = j; } else if(j>=14 && j<=26) { str[num] = 'H'; snum[num] = j-13; } else if(j>=27 && j<=39) { str[num] = 'C'; snum[num] = j-26; } else if(j>=40 && j<=52) { str[num] = 'D'; snum[num] = j-39; } else if(j == 53) { str[num] = 'J'; snum[num] = 1; } else if(j == 54) { str[num] = 'J'; snum[num] = 2; } } for(int q=1;q<=54;q++) { if(q!=1)printf(" "); printf("%c%d",str[q],snum[q]); } printf("\n"); }