/*****************************************************************//**
* \file TwoCupsOfWaters.h
* \brief
* 平衡数的定义:将一个数分成左右两部分,分别成为2个新数。左右不分必须满足:
* 1、左边和右边至少存在一位
* 2、左边数的每一位相乘如果等于右边数每一位相乘
* 则这个数称为平衡数。
* \author geovindu
* \date 20 May 2023
*********************************************************************/
#pragma once
#ifndef TWOCUPSOFWATERS_H
#define TWOCUPSOFWATERS_H
#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
using namespace std;
namespace DuStructSimple
{
/// <summary>
///
/// </summary>
struct TwoWater
{
/// <summary>
/// 第一杯
/// </summary>
int OneCups;
/// <summary>
/// 第二杯
/// </summary>
int TwoCups;
};
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="a"></param>
/// <param name="b"></param>
template<typename T>
void duswap(T& a, T& b)
{
T temp(a);
a = b;
b = temp;
}
/// <summary>
/// 两值交换
/// </summary>
/// <param name="ptr_a"></param>
/// <param name="ptr_b"></param>
void swap(int* ptr_a, int* ptr_b)
{
int temp = *ptr_a;
*ptr_a = *ptr_b;
*ptr_b = temp;
}
/// <summary>
/// 两值交换
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
void swap1(int* a, int* b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
/// <summary>
/// 两值交换
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
void swap2(int* a, int* b)
{
*a = *a * *b;
*b = *a / *b;
*a = *a / *b;
}
/// <summary>
/// 两值交换
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
void swap3(int* a, int* b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
/// <summary>
///
/// </summary>
/// <param name="arr"></param>
/// <param name="length"></param>
/// <returns></returns>
int calcBalance(int arr[], int length)
{
int* left = new int[length]; //left[i]为从第0个到第i-1个的和
int* right = new int[length]; //right[i]为从第i+1个到第len-1个的和
int b = length - 1;
for (int i = 0; i < length; i++)
{
if (i == 0)
left[i] = 0;
else
left[i] = left[i - 1] + arr[i - 1];
}
for (; b >= 0; b--)
{
if (b == length - 1)
right[b] = 0;
else
right[b] = right[b + 1] + arr[b + 1];
if (left[b] == right[b])
{
delete[] left;
delete[] right;
return b;
}
}
delete[] left;
delete[] right;
return -1;
}
/// <summary>
///
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
int bacance(int a, int b)
{
int ba=0;
float ver = (a + b) / 2; //平均值
if (a > b)
{
cout << "第一杯水量大于第二杯水:" <<a<<">"<<b << endl;
}
if (a < b)
{
cout << "第一杯水量小于第二杯水:" << a << "<" << b << endl;
}
if (a == b)
{
cout << "第一杯水量等于第二杯水:" << a << "=" << b << endl;
}
return ver;
}
/// <summary>
/// 判断是否平衡数
/// https ://blog.csdn.net/sinat_30440627/article/details/65448970
///
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
bool isBalance(int n) {
if (n < 10) {
return false;
}
int count = 0;
int temp = n; //计算位数
while (temp != 0) {
temp /= 10;
count++;
}
vector<int> ret; //由低位到高位放入容器内
while (n != 0) {
ret.push_back(n % 10);
n /= 10;
}
int flag = false;
int mult1 = 1;
for (int i = 0; i < count - 1; i++) { //循环相乘判断是否相等
mult1 *= ret[i]; //右边相乘结果
int mult2 = 1;
for (int j = i + 1; j < count; j++) {
mult2 *= ret[j]; //左边相乘结果
}
if (mult1 == mult2) {
flag = true;
break;
}
}
if (flag) {
return true;
}
else {
return false;
}
}
/// <summary>
/// 判断是否平衡数
/// https://www.cnblogs.com/omelet/p/6617086.html
/// </summary>
/// <param name="arr"></param>
/// <param name="n"></param>
/// <returns></returns>
bool findCount(vector<int> arr, int n) {
// write code here
if (n < 2 || n>50)
return false;
int begin = 0;
int end = n - 1;
long long res1 = 1;
long long res2 = 1;
int count = 0;
for (int i = 0; i < n; i++)
{
if (arr[i] == 0)
count++;
}
if (count >= 2)//处理含有多个0的情况
return true;
while (begin <= end)
{
if (res1 <= res2)
{
res1 *= arr[begin];
begin++;
}
else
{
res2 *= arr[end];
end--;
}
}
if (res1 == res2)
return true;
else
return false;
}
/// <summary>
///
/// </summary>
/// <param name="onecup"></param>
/// <returns></returns>
bool isduBalanc(int onecup)
{
if (onecup <= 10)
{
cout << "不是平衡数" << endl;
return false;
}
vector<int> res;
while (onecup)
{
res.push_back(onecup % 10);
onecup /= 10;
}
bool result = findCount(res, res.size());
if (result == 1)
{
cout << "是平衡数" << endl;
return true;
}
if (result == 0)
{
cout << "不是平衡数" << endl;
return false;
}
}
/// <summary>
///
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
int difference(int *a, int *b)
{
int di = 0;
int ad = *a - *b;
int bd = *b - *a;
if (ad == bd)
{
cout << "两杯水水位平衡" << endl;
int* p = a;
int* p2 = b;
//*p = &a;
//*p2 = &b;
cout << "两杯水正互相交换" << endl;
swap(p, p2);
di = ad;
}
else
{
int* p = a;
int* p2 = b;
//*p = &a;
//*p2 = &b;
cout << "两杯水正互相交换" << endl;
swap(p, p2);
}
return di;
}
/// <summary>
///
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
bool match(int n) { //平衡数匹配
//int to string
/*ostringstream oss;
oss << n;
string s = oss.str();*/
string s = to_string(n); //c++11
int len = s.size(), mid = len / 2;
bool isEven = (len % 2 == 0);
int frontNum = 0, tailNum = 0;
for (int i = 0; i < len; i++) {
if (i < mid) frontNum += s[i] - '0';
//Even: mid ~ len-1, Odd: mid+1 ~ len-1
else if ((isEven && i == mid) || i > mid) tailNum += s[i] - '0';
}
return frontNum == tailNum;
}
/// <summary>
///
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
int balanceNum(int n) {
int sum = 0;
if (n <= 10) { return 0; }
if (n > 10) {
int newNum = n;
if (n >= 100) newNum = 99;
int count = newNum / 10;
for (int i = 1, j = 1; i <= count; i++, j++) {
sum += i * 10 + j;
cout << i * 10 + j << ", ";
}
}
if (n >= 100) {
int count = 0;
for (int i = 101; i <= n; i++) {
if (match(i)) {
count++;
cout << i << ", ";
if (count % 10 == 0) {
cout << endl;
}
sum += i;
}
}
}
return sum;
}
}
#endif