[编程题] 平衡数
时间限制: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 }