加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

HDU - 5186 - zhx's submissions (大数高精度)

发布时间:2020-12-14 02:43:18 所属栏目:大数据 来源:网络整理
导读:zhx's submissions Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 540????Accepted Submission(s): 146 Problem Description As one of the most powerful brushes,zhx submits a lot of code

zhx's submissions

Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 540????Accepted Submission(s): 146


Problem Description
As one of the most powerful brushes,zhx submits a lot of code on many oj and most of them got AC.
One day,zhx wants to count how many submissions he made on? n ?ojs. He knows that on the? ith ?oj,he made? ai ?submissions. And what you should do is to add them up.
To make the problem more complex,zhx gives you? n ? B?base ?numbers and you should also return a? B?base ?number to him.
What's more,zhx is so naive that he doesn't carry a number while adding. That means,his answer to? 5+6 ?in? 10?base ?is? 1 . And he also asked you to calculate in his way.
?

Input
Multiply test cases(less than? 1000 ). Seek? EOF ?as the end of the file.
For each test,there are two integers? n ?and? B ?separated by a space. ( 1n100 ,? 2B36 )
Then come n lines. In each line there is a? B?base ?number(may contain leading zeros). The digits are from? 0 ?to? 9 ?then from? a ?to? z (lowercase). The length of a number will not execeed 200.
?

Output
For each test case,output a single line indicating the answer in? B?base (no leading zero).
?

Sample Input
  
  
2 3 2 2 1 4 233 3 16 ab bc cd
?

Sample Output
  
  
1 233 14
?

Source
BestCoder Round #33
?






思路:就是不进位的大数相加啦,要注意当结果为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[],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,sizeof(ch));
	memset(to,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",&B)) {
		memset(ans,sizeof(ans));
		memset(tmp,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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读