这道题首先要读懂题意:
1:日期中每次数字出现的次数相等,
2:日期分割成四个部分,Year分成两个部分。这四个数字存在总和相等的两部分。(2,2与1,3)。
附上代码:思路很清楚,算法很朴素。
#include <iostream>
#include<string.h>
#include<stdio.h>
#include <algorithm>
using namespace std;
int a[4];
void qsort(int a[], int n)
{
for(int i = 1; i<=n-1; i++)
{
int k = i-1;
for(int j = i; j<n; j++)
{
if(a[j]<a[k])
k = j;
if(k != (i-1))
swap(a[i-1],a[k]);
}
}
}
int main()
{
int n;
cin>>n;
while(n>0)
{
int d,m,y;
cin>>d>>m>>y;
int y1,y2;
y1 = y/100;
y2 = y%100;
a[0] = d;a[1]= m;a[2] = y1;a[3] = y2;
qsort(a, 4);
if(!(a[0]+a[3] == a[1]+a[2] || a[1]+a[0]+a[2]== a[3]))
{
cout<<"no"<<endl;
n--;
continue;
}
int sw[8],w[11];
// memset(sw, 10, sizeof(sw));
memset(w, 0, sizeof(w));
if(d<10)
{
sw[0] = 10;
sw[1] = d;
}
else
{
sw[0] = d/10;
sw[1] = d%10;
}
if(m<10)
{
sw[2] = 10;
sw[3] = m;
}
else
{
sw[2] = m/10;
sw[3] = m%10;
}
sw[4] = y/1000; y %= 1000;
sw[5] = y/100; y %= 100;
sw[6] = y/10; y %= 10;
sw[7] = y;
for(int i = 0; i<8; i++)
switch(sw[i])
{
case 0: w[0] ++; break;
case 1: w[1] ++; break;
case 2: w[2] ++; break;
case 3: w[3] ++; break;
case 4: w[4] ++; break;
case 5: w[5] ++; break;
case 6: w[6] ++; break;
case 7: w[7] ++; break;
case 8: w[8] ++; break;
case 9: w[9] ++; break;
default: break;
}
bool bl = true;
int i;
for(i = 0; i<10; i++)
if(w[i] !=0)
{
break;
}
for(int j = i; j<10; j++)
{
if(w[j] != w[i]&& w[j] != 0)
{
bl = false;
break;
}
}
if(bl)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
n--;
}
return 0;
}