cpp: two cups waters
/*****************************************************************//**
* \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)
{
float ba = 0;
float bb = 0;
float ver = (a + b) / 2; //平均值
if (a > b)
{
ba = a - ver;
bb = ver - b;
cout << "第一杯水量大于第二杯水:" <<a<<">"<<b << endl;
cout << "第一杯倒去" << ba << "升水给第二杯,两杯水相同" << endl;
}
if (a < b)
{
ba = ver - a;
bb = b - ver;
cout << "第一杯水量小于第二杯水:" << a << "<" << b << endl;
cout << "第二杯倒去" << bb << "升水给第一杯,两杯水相同" << endl;
}
if (a == b)
{
cout << "第一杯水量等于第二杯水:" << a << "=" << b << endl;
}
return ver;
}
/// <summary>
///
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
float bacancePoint(int* a, int* b)
{
float ba = 0;
float bb = 0;
float ver = (*a + *b) / 2; //平均值
if (*a > *b)
{
ba = *a- ver;
bb = ver -*b ;
cout << "第一杯水量大于第二杯水:" << *a << ">" << *b << endl;
cout << "第一杯倒去" << ba << "升水给第二杯,两杯水相同"<< endl;
}
if (*a < *b)
{
ba = ver- *a;
bb = *b-ver ;
cout << "第一杯水量小于第二杯水:" << *a << "<" << *b << endl;
cout << "第二杯倒去" << bb << "升水给第一杯,两杯水相同" << 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;
float offset = 0;
if (a > b)
{
offset = (*a - *b) / 2;
}
else
{
offset = (*b - *a) / 2;
}
//int ad = *a + offset;
//int bd = *b +offset;
*a = *a + offset;
*b = *b + offset;
if (*a == *b)
{
cout << "两杯水水位平衡" << endl;
int* p = a;
int* p2 = b;
//*p = &a;
//*p2 = &b;
cout << "两杯水正互相交换" << endl;
swap(p, p2);
di = offset;
}
else
{
cout << "两杯水水位不平衡" << endl;
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
/// <summary>
/// 两杯水
/// </summary>
void GeovinDu::dispalyTowCups()
{
int onecup = 0;
int twocup = 0;
try
{
/* cin.clear();*/
std::cout << "请输入第一杯水(整数(0-100)):" << endl;
while (true)
{
//if (onecup > 0)
// break;
std::cin >> onecup;
//规换成:
// onecup = getchar();
//while (!(cin >> onecup))
//{
// std::cout << "输入的数据类型错误,请重新输入第一杯水:";//输入整数的需要两次
// cin.clear(); //这一句很总要,将cin重新标记为正确,以达到重新输入的目的
// while (cin.get() != '\n') //这里清空之前cin缓冲区的数据
// continue;
// // while (getchar() != '\n');
//
//}
//if (typeid(onecup) == typeid(int)) {
// cout << "a的数据类型是:整型" << endl;
//}
//if (!(cin >> twocup))
//{
// cout << "输入的数据类型错误,请重新输入第一杯水:";
// cin.clear(); //这一句很总要,将cin重新标记为正确,以达到重新输入的目的
// while (cin.get() != '\n') //这里清空之前cin缓冲区的数据
// continue;
// //while (getchar() != '\n')
// // continue;
//}
//else
//{
//if (cin.rdstate()) || if (cin.rdstate() != ios::goodbit) 这两个也判断cin是否出错
ios_base::iostate flag = cin.rdstate();
//cout << flag << endl;
while (cin.fail())
{
cerr << "输入错误!请重新输入第一杯水:";
cin.clear();
//cin.ignore();
//cin.sync();
//cin.ignore(1, EOF);
//std::cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.ignore(100, '\n');
cin >> onecup;
}
if (onecup > 0 && onecup <= 100)
{
break;
}
else
{
cin.clear();
std::cout << "输入的数据无效!重新输入第一杯水" << endl; //输入字符型,显示这个死循环
continue;
}
//}
} //while (onecup > 0 && onecup <= 100);
//while (getchar() != '\n')
// continue;
//do
//{
// cin >> onecup;
// while (!(cin >> onecup))
// {
// cout << "输入的数据类型错误,请重新输入第一杯水:";
// cin.clear(); //这一句很总要,将cin重新标记为正确,以达到重新输入的目的
// while (cin.get() != '\n') //这里清空之前cin缓冲区的数据
// continue;
// //break;
// }
// if (onecup > 0 && onecup <= 100)
// {
// //cin.clear();
// //while (cin.get() != '\n') //这里清空之前cin缓冲区的数据
// // continue;
// break;
// }
// else
// {
// cout << "输入的数据无效!重新输入第一杯水" << endl;
// continue;
// }
//
//} while (onecup > 0 && onecup <= 100);
cin.clear();
std::cout << "请输入第二杯水(整数(0-100))" << endl;
while (true)
{
cin >> twocup;
while (cin.fail())
{
cerr << "输入错误!请重新输入第二杯水::";
cin.clear();
//cin.ignore();
//cin.sync();
//cin.ignore(1, EOF);
//std::cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.ignore(100, '\n');
cin >> twocup;
}
//twocup = getchar();
//while (!(cin >> twocup))
//{
// std::cout << "输入的数据类型错误,请重新输入第二杯水:";
// cin.clear(); //这一句很总要,将cin重新标记为正确,以达到重新输入的目的
// while (cin.get() != '\n') //这里清空之前cin缓冲区的数据
// continue;
//}
//if (!(cin >> twocup))
//{
// std::cout << "输入的数据类型错误,请重新输入第二杯水:";
// cin.clear(); //这一句很总要,将cin重新标记为正确,以达到重新输入的目的
// while (cin.get() != '\n') //这里清空之前cin缓冲区的数据
// continue;
//}
if (twocup > 0 && twocup <= 100)
{
//cin.clear();
//while (cin.get() != '\n') //这里清空之前cin缓冲区的数据
// continue;
break;
}
else
{
cin.clear();
std::cout << "输入的数据无效!重新输入第二杯水" << endl;
continue;
}
}
std::cout << "原值" << endl;
std::cout <<"\t第一杯水"<< "\t第二杯水" << endl;
std::cout << "\t" << onecup << "\t\t" << twocup << endl;
int cal[2] = { onecup,twocup };
int* sd = cal;
int ba = calcBalance(sd, 2);
std::cout <<"平衡数:"<< ba << endl;
//
bacance(onecup, twocup);
int* p = &onecup;
int* p2 = &twocup;
difference(p, p2);
std::cout << "交换的值" << endl;
std::cout <<"\t 第一杯水"<< "\t第二杯水" << endl;
std::cout << "\t" << *p << "\t\t" << *p2 << endl;
bacancePoint(p,p2);
std::cout << "第一杯水:" << isduBalanc(onecup) << endl;
std::cout << "第二杯水:" << isduBalanc(twocup) << endl;
}
catch (const std::exception&)
{
std::cout << "输入错误"<< endl;
}
}
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
浙公网安备 33010602011771号