平衡数--全国模拟(二)

[编程题] 平衡数
时间限制:1秒
空间限制:32768K
牛牛在研究他自己独创的平衡数,平衡数的定义是:将一个数分成左右两部分,分别成为两个新的数。
左右部分必须满足以下两点:
1,左边和右边至少存在一位。
2,左边的数每一位相乘如果等于右边的数每一位相乘,则这个数称为平衡数。
例如:1221这个数,分成12和21的话,1*2=2*1,则称1221为平衡数,再例如:1236这个数,可以分成123和1*2*3=6,所以1236也是平衡数。而1234无论怎样分也不满足平衡数。 
输入描述:
输入一个正整数(int范围内)。
 
 
输出描述:
如果该数是平衡数,输出 "YES", 否则输出 "NO"。
 
输入例子:
1221 1234
 
输出例子:
YES NO
 
解题思路:用vector存储数字的每一位,然后start指向vector的起始,end指向vector的结束。然后进行操作,知道start == end 或者start == end-1&&left==right时结束循环。
对于left<right 则start++  left>end end--  相等时判断是否结束,未结束,其中一个移动进行下一次判断。结束跳出循环。
注意:针对数中包含偶数个0的情况,进行单独处理
length == 1的情况单独处理
 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 bool isTwoZero(vector<int> a)
 5 {
 6     int count = 0;
 7     for(int i=0;i<a.size();i++)
 8     {
 9         if(a[i] == 0)
10             count++;
11     }
12     if(count && count%2==0)
13         return true;
14     else
15         return false;
16 }
17 int main()
18 {
19     int n;
20     while(cin>>n)
21     {
22         vector<int> a;
23         while(n)
24         {
25             a.push_back(n%10);
26             n /=10;
27         }
28         int length = a.size();
29         int start = 0;
30         int left = a[start];
31         int end = length-1;
32         int right = a[end];
33         while(start<end)
34         {
35             if(left < right)
36             {
37                 start++;
38                 left *= a[start];
39             }
40             else if(left > right)
41             {
42                 end--;
43                 right *= a[end];
44             }
45             else
46             {
47                 if(start == end -1)
48                 {
49                     break;
50                 }
51                 else
52                 {
53                     start++;
54                     left *= a[start];
55                 }
56             }
57         }
58         if(length == 1)
59             cout<<"NO"<<endl;
60         else if(isTwoZero(a))
61             cout<<"YES"<<endl;
62         else if(left == right)
63             cout<<"YES"<<endl;
64         else
65             cout<<"NO"<<endl;
66     }
67     return 0;
68 }
网上思路参考:针对位i,比较0-i乘积与i+1-length-1乘积是否相等,,有相等的就退出for循环,结束输出YES,否则输出NO
针对一位的数字,单独处理
 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4  
 5 void BalanceNum(int Num)
 6 {
 7     vector<int> vec;
 8     while (Num)
 9     {
10         int aa;
11         aa = Num % 10;
12         vec.push_back(aa); //按位放入数组中
13         Num = Num / 10;
14     }
15     //只有一个数字时,输出“NO”
16     if (vec.size() == 1)
17     {
18         cout << "NO" << endl;
19         return;
20     }
21     for (int i = 0; i<vec.size(); i++)
22     {
23         int begin = 1;
24         int end = 1;
25         //开始到变量i之间的数字的乘积
26         for (int j = 0; j<i; j++)
27         {
28             begin *= vec[j];
29         }
30         //变量i到结束数字的乘积
31         for (int k = i; k<vec.size(); k++)
32         {
33             end *= vec[k];
34         }
35         //存在相等的情况输出“YES”,并结束所有判断
36         if (begin == end)
37         {
38             cout<<"YES"<<endl;
39             return;
40         }
41     }
42     cout << "NO" << endl;
43 }
44  
45 int main()
46 {
47     int N;
48     cin >> N;
49     BalanceNum(N);
50     return 0;
51 }


 

原文地址:https://www.cnblogs.com/qqky/p/7001737.html