标签: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