면접 문제 정리. - 대수 구 화.

3075 단어 cStringstdstring
제목 의 뜻 은 매우 간단 하 다. 바로 두 개의 임 의 정수 의 합 을 구 하 는 것 이다.
원제:
http://acm.hdu.edu.cn/showproblem.php?pid=1002
먼저 정확 한 사 고 를 말 하 다.
첫 번 째 단계:
입력 한 처리:
입력 이 00000123344 라면 123344 로 처리 해 야 합 니 다.
함수:
string &_del_zeros_before_dot(string &a)
{
	if (a.length() <= 0 || a[0] != '0') return a;
	int i = 0;
	while (i < a.length() && a[i] == '0') ++i;
	a = a.substr(i, a.length() - i);
	return a;
}

두 번 째 단계:
화 해 를 구 할 때 두 개의 정수 가 합 쳐 지기 때문에 가장 많이 증가 하 는 자릿수 는 1 (즉 문자열 의 길이 가 1) 이다.
게다가 두 문자열 을 모두 처리 해 야 한다.두 문자열 을 처리 한 후 에는 반드시 진 위 를 처리 하 는 상황 을 기억 해 야 한다.
여기 서 이런 처 리 를 간소화 했다.간단 한 코드 봐.
string &_string_add_string(const string &a, const string &b, string &res)
{
	int sum_value = 0, add_bit = 0;
	const int alen = a.length(), blen = b.length();
	res = "0" + (alen > blen ? a : b);
	for (int i = alen-1, j = blen-1, k = res.length() - 1; 
		 i >= 0 || j >= 0 || add_bit > 0; 
		 --i, --j, --k){
		sum_value = (i>=0 ? a[i]-48: 0) + (j>=0 ? b[j]-48: 0) + add_bit;
		add_bit = sum_value / 10; 
		res[k] = sum_value%10 + '0';
	}
	if (res[0] == '0') res = res.substr(1, res.length() - 1);
	return res;
}

결과 1 위 는 0 이 될 수 없 기 때문에 마지막 으로 res 의 1 위 를 삭제 할 지 여 부 를 판단 해 야 한다.
세 번 째 단계:
AC 코드 를 드 리 겠 습 니 다.
#include <iostream>
#include <string>
using namespace std;

string &_del_zeros_before_dot(string &a)
{
	if (a.length() <= 0 || a[0] != '0') return a;
	int i = 0;
	while (i < a.length() && a[i] == '0') ++i;
	a = a.substr(i, a.length() - i);
	return a;
}

string &_string_add_string(const string &a, const string &b, string &res)
{
	int sum_value = 0, add_bit = 0;
	const int alen = a.length(), blen = b.length();
	res = "0" + (alen > blen ? a : b);
	for (int i = alen-1, j = blen-1, k = res.length() - 1; 
		 i >= 0 || j >= 0 || add_bit > 0; 
		 --i, --j, --k){
		sum_value = (i>=0 ? a[i]-48: 0) + (j>=0 ? b[j]-48: 0) + add_bit;
		add_bit = sum_value / 10; 
		res[k] = sum_value%10 + '0';
	}
	if (res[0] == '0') res = res.substr(1, res.length() - 1);
	return res;
}

int main(void)
{
	string a, b, c;
	int t;
	scanf("%d", &t);
	for (int i = 1; i < t + 1; ++i){
		cin >> a >> b; 
		_del_zeros_before_dot(a); 
		_del_zeros_before_dot(b);

		printf("Case %d:
%s + %s = ", i, a.c_str(), b.c_str()); _string_add_string(a, b, c); printf("%s
", c.c_str()); if (i != t) printf("
"); } return 0; }

좋은 웹페이지 즐겨찾기