标签:acm algorithm hdu cstring 大数高精度
2 3 2 2 1 4 233 3 16 ab bc cd
1 233 14
思路:就是不进位的大数相加啦,要注意当结果为0时输出一个0,之前我还做过一个差不多的,上次注意到了,,这次居然没注意到o(╯□╰)o.........
疑问:为何运行时间900多ms,而且还可能会T,把cstdio改为stdio.h时间就降下来了,直接变为100多ms,害的我还检查半天。。。但是这是为什么??????
搞了半天我发现使用g++环境提交的没过,而用c++环境就过啦(以后再HDU做题还是用c++环境吧,醉啦)
据说g++用scanf因为输入太慢而要开挂(难道和cin减速一个性质??),,,,貌似是这样的,以后再试试
void gn(int &x){ char c;while((c=getchar())<'0'||c>'9');x=c-'0'; while((c=getchar())>='0'&&c<='9')x=x*10+c-'0'; }
AC代码①(100+ms,g++环境):
#include <stdio.h> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; char ans[205]; char t[205]; void fun(char ans[], char t[]) { int len = strlen(t); for(int i = 0; i < len; i++) { ans[i] = t[len - 1 - i]; } } void swap(char t[]) { int len = strlen(t); for(int i = 0; i < len / 2; i++) { char m = t[i]; t[i] = t[len - 1 - i]; t[len - 1 - i] = m; } } void add(char ans[], char t[], int B) { int t1, t2, t3; int len = strlen(t); for(int i = 0; i < len; i++) { if(ans[i] <= 'z' && ans[i] >= 'a') t1 = (int)(ans[i] - 'a' + 10); else t1 = ans[i] - '0'; if(t[i] <= 'z' && t[i] >= 'a') t2 = (int)(t[i] - 'a' + 10); else t2 = t[i] - '0'; t3 = (t1 + t2) % B; if(t3 >= 10) ans[i] = (char)(t3 - 10 + 'a'); else ans[i] = (char)(t3 + '0'); } } void print(char ans[]) { int flag = 0, p; for(int i = 204; i >= 0; i--) { if(ans[i] != '0') { printf("%c", ans[i]); flag = 1; } else if(ans[i] == '0' && flag) printf("0"); } if(flag == 0) printf("0"); printf("\n"); } int main() { int n, B; while(scanf("%d %d", &n, &B) != EOF) { for(int i = 0; i< 205; i++) ans[i] = '0'; scanf("%s", t); fun(ans, t); for(int i = 0; i < n-1; i++) { scanf("%s", t); swap(t); add(ans, t, B); } print(ans); } return 0; }
代码②(900+ms or TLE,g++环境):
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; char ans[205]; char t[205]; void fun(char ans[], char t[]) { int len = strlen(t); for(int i = 0; i < len; i++) { ans[i] = t[len - 1 - i]; } } void swap(char t[]) { int len = strlen(t); for(int i = 0; i < len / 2; i++) { char m = t[i]; t[i] = t[len - 1 - i]; t[len - 1 - i] = m; } } void add(char ans[], char t[], int B) { int t1, t2, t3; int len = strlen(t); for(int i = 0; i < len; i++) { if(ans[i] <= 'z' && ans[i] >= 'a') t1 = (int)(ans[i] - 'a' + 10); else t1 = ans[i] - '0'; if(t[i] <= 'z' && t[i] >= 'a') t2 = (int)(t[i] - 'a' + 10); else t2 = t[i] - '0'; t3 = (t1 + t2) % B; if(t3 >= 10) ans[i] = (char)(t3 - 10 + 'a'); else ans[i] = (char)(t3 + '0'); } } void print(char ans[]) { int flag = 0, p; for(int i = 204; i >= 0; i--) { if(ans[i] != '0') { printf("%c", ans[i]); flag = 1; } else if(ans[i] == '0' && flag) printf("0"); } if(flag == 0) printf("0"); printf("\n"); } int main() { int n, B; while(scanf("%d %d", &n, &B) != EOF) { for(int i = 0; i< 205; i++) ans[i] = '0'; scanf("%s", t); fun(ans, t); for(int i = 0; i < n-1; i++) { scanf("%s", t); swap(t); add(ans, t, B); } print(ans); } return 0; }
AC代码③:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define maxn 205 char tmp[maxn][maxn], ans[maxn][maxn], ch[50]; int to[maxn]; void init() { memset(ch, 0, sizeof(ch)); memset(to, 0, sizeof(to)); for(int i = 0; i <= 35; i++) { if(i <= 9) ch[i] = i + '0', to[i + '0'] = i; else ch[i] = i - 10 + 'a', to[i - 10 + 'a'] = i; } } int main() { int n, B; init(); while(~scanf("%d %d", &n, &B)) { memset(ans, 0, sizeof(ans)); memset(tmp, 0, sizeof(tmp)); for(int i = 1; i <= n; i++) { scanf("%s", tmp[i]); int len = strlen(tmp[i]); for(int j = 0; j < len; j++) { ans[i][j] = tmp[i][len-1-j]; } } int flag = 0; for(int i = maxn - 1; i >= 0; i--) { int t = 0; for(int j = 1; j <= n; j++) { t += to[ans[j][i]]; } t %= B; if(t) flag = 1; if(flag) printf("%c", ch[t]); } if(!flag) printf("0"); printf("\n"); } return 0; }
HDU - 5186 - zhx's submissions (大数高精度)
标签:acm algorithm hdu cstring 大数高精度
原文地址:http://blog.csdn.net/u014355480/article/details/44266315