前言:
坚持写因为今天我发现自己的博客居然被盗了,感动!
所以决定继续OJ,记录一下自己解决不是很顺畅的题(或没查到相同题目解法的题)。
题目:
问题描述 :
明明喜欢玩游戏,而明明的爸爸也乐意陪明明玩各种各样的小游戏。但是在游戏中,明明的爸爸又十分注意培养明明的智力,他希望通过游戏,不仅能让明明得到快乐,而且又能让明明学到一些知识,锻炼他的思维能力,为将来的发展打下基础。
一天,明明的爸爸和明明做起了一个叫“环”的游戏。游戏的内容很简单但却很有趣,就是有1到9九个整数,他们以任意的顺序排列成一个圆环,然后要在这个圆环中剪一刀,再分别按顺时针和逆时针次序排列成两个九位数。现在的要求是,得到的这两个九位数差的绝对值能被396整除,问一共有几种剪环的方法。 例如九个数的排列为:1、2、3、4、5、6、7、8、9,在1和9之间剪一刀(注意:因为是一个环,所以1和9是相邻的。),顺时针形成的数为:123456789,逆时针形成的数为:987654321,这两个数的差的绝对值为:864197532,这个数能被396整除,因此这是一种符合规则的剪法,更奇妙的是,这也是这种排序方式的唯一剪法。
明明显然对这个游戏非常感兴趣,高兴地做起来。但是玩了几次后,明明发现这个游戏又并不是那么容易了,因为对于这九个数来说,虽然一共只有九种剪法,但是每种方法都要试,且还要做加法再做除法,他觉得非常的麻烦,玩着玩着就失去了兴趣。明明的爸爸发现了这个问题,于是就找到了你,他请你来帮明明一把,写一个程序,计算出某个排序中符合条件的剪法共有几种,这样的话可以大大鼓励明明玩游戏的兴致。
明明爸爸的问题可以归结为:将1至9这九个数字,以任意顺序排成一个环,请在某两个数字之间剪开,分别按顺时针和逆时针次序排列成两个九位数,要求剪开后所得到的这两个九位数的差能被396整除,问共有几种剪法?
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,输入的第一行有一个整数n,表示一共有多少组测试数据,接下来有n行,为n个测试数据,每组测试数据有9个数字,表示一种环的排列顺序,每个数字之间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即有多少种符合条件的剪法。每组运算结果的行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
输入范例 :
2
1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1
输出范例 :
1
1
自己的解法以及思路:
构成一个环,也就是输入的数据是连续的,根据题目给出的数目不大:9个数,以及没有0的参与,所以讲顺序和逆序分别存储到两个数组,并且将给出的数列连续储存两份以达成能够轻松输出的结果。
中间的数字运算部分可以自己写个新函数进行类似竖式加减运算,将结果存到一个新的数组再输出这个数组。但是这个问题的数字并不大,所以就直接这么写了(挺笨的。
C++代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int num0[20]={0};//存环中的数 顺序
int num1[20]={0};//存环中的数 逆序
for(int i =0;i<n;i++){
for(int j =0;j<9;j++){
scanf("%d",&num0[j]);
num0[j+9]=num0[j];
num1[8-j]=num0[j];
num1[17-j]=num0[j];
}
long long int sum0=0;
long long int sum1=0;
int times=0;
for(int j=0;j<9;j++){
int k;
sum0=num0[j]*10*10*10*10*10*10*10*10+num0[j+1]*10*10*10*10*10*10*10+num0[j+2]*10*10*10*10*10*10+num0[j+3]*10*10*10*10*10+num0[j+4]*10*10*10*10+num0[j+5]*10*10*10+num0[j+6]*10*10+num0[j+7]*10+num0[j+8];
for(k=0;k<9;k++){
if(num0[j]==num1[k]){
k++;
break;
}
}
sum1=num1[k]*10*10*10*10*10*10*10*10+num1[k+1]*10*10*10*10*10*10*10+num1[k+2]*10*10*10*10*10*10+num1[k+3]*10*10*10*10*10+num1[k+4]*10*10*10*10+num1[k+5]*10*10*10+num1[k+6]*10*10+num1[k+7]*10+num1[k+8];
if(abs(sum0-sum1)%396==0){
times++;
}
}
printf("%d\n",times);
}
return 0;
}