社区讨论

abc_b help

学术版参与者 6已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@ltu5gka7
此快照首次捕获于
2024/03/16 21:54
2 年前
此快照最后确认于
2024/03/17 01:01
2 年前
查看原帖
CPP
#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;

string fixedNum( string a ) {
	if ( a.size() == 1 )
		return a;
	for ( int i = 0; i < a.size(); i++ )
		if ( '1' <= a[i] && a[i] <= '9' )
			return a.substr( i, a.size() );
	return "0";
}

string calcAddition( string a, string b ) {
	a = fixedNum(a);
	b = fixedNum(b);
	int as = a.size(), bs = b.size(), d = as > bs ? as - bs : bs - as;
	string s = "0", t = "0";
	for ( int i = 0; i < d; i++ )
		as > bs ? t += "0" : s += "0";
	s += a;
	t += b;

	for ( int i = s.size() - 1; i >= 1; i-- ) {
		s[i] += t[i] - '0';
		if ( s[i] > '9' ) {
			s[i] -= 10;
			s[i - 1]++;
		}
	}
	return s[0] == '0' ? s.substr( 1, s.size() ) : s;
}

string calcSubtraction( string a, string b ) {
	int as = a.size(), bs = b.size(), d = as - bs;
	string s = "", t = "";
	for ( int i = 0; i < d; i++ )
		t += "0";

	s += a;
	t += b;

	for ( int i = s.size() - 1; i >= 0; i-- ) {
		if ( s[i] < t[i] ) {
			s[i] += 10;
			if ( s[i - 1] >= '1' )
				s[i - 1]--;
			else {
				int j = i - 1;
				while ( s[j] == '0' )
					s[j--] += 9;
				s[j]--;
			}
		}
		s[i] -= ( t[i] - '0' );
	}

	if ( s.size() == 1 )
		return s;

	for ( int i = 0; i < s.size(); i++ ) {
		if ( '1' <= s[i] && s[i] <= '9' )
			return s.substr( i, s.size() );
	}
	return "0";
}

int main() {
	string a, b, c, sum = "0", cnt = "1";
	bool j1 = false;
	cin >> a;
	b = "10";
	if ( a == "0" ) {
		cout << 0 << endl;
		return 0;
	} else if ( a[0] == '-' && b[0] == '-' ) {
		a = a.substr( 1, a.size() );
		b = b.substr( 1, b.size() );
	} else if ( a[0] == '-' ) {
		j1 = true;
		a = a.substr( 1, a.size() );
	} else if ( b[0] == '-' ) {
		j1 = true;
		b = b.substr( 1, b.size() );
	} else;

	c = b;
	int as = a.size(), bs = b.size(), cs, d = as - bs;
	for ( int i = 0; i < d - 1; i++ ) {
		c += "0";
		cnt += "0";
	}
	cs = c.size();

	bool j2 = false;
	while ( c != b ) {
		while ( as > cs || as == cs && a >= c ) {
			j2 = true;
			a = calcSubtraction( a, c );
			as = a.size();
			sum = calcAddition( sum, cnt );
		}
		c = c.substr( 0, c.size() - 1 );
		cnt = cnt.substr( 0, cnt.size() - 1 );
		cs = c.size();
	}

	while ( as > bs || as == bs && a >= b ) {
		j2 = true;
		a = calcSubtraction( a, b );
		sum = calcAddition( sum, cnt );
		as = a.size();
	}
	int d1 = 0;
	if ( j1 && j2 ) {
		cout << '-';
		d++;
	}
	double naum = 0;
	for (int i = 0; i < sum.size(); ++i) {
		naum = 10 * naum + (sum[i] - '0');
	}
	if (naum > 0 && d == 1) {
		cout << naum ;
		return 0;
	} else
		cout << fixed << setprecision (0) << naum + 1 << endl;
	return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...