29 环(进阶题)----东华大学2020计算机考研复试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
如有问题,欢迎关注我的公众号(程序媛Ya),可获得各种编程技术资源。谢谢
#include <stdio.h>
int main() {
int n,a[9],i,sum1,sum2,j,count,k;
scanf("%d",&n);
for(k=0;k<n;k++) {
for(i=0;i<9;i++) {
scanf("%d",&a[i]);
}
count=0;
for(i=0;i<9;i++) {
//定义初始值
sum1 = a[i];
if(i-1<0)
sum2=0;
else
sum2=a[i-1];
//计算顺时针的值
for(j=i+1;j<i+9;j++) {
if(j>=9) {
sum1=sum1*10+a[j%9];
}
else
sum1=sum1*10+a[j];
}
//计算逆时针的值
for(j=i-2;j>=0;j--) {
sum2=sum2*10+a[j];
}
for(j=8;j>=i;j--)
sum2=sum2*10+a[j];
//判断是否整除396
if(abs(sum2-sum1) % 396==0)
count++;
}
printf("%d\n",count);
}
return 0;
}
上一篇: 2020年全国高校计算机能力挑战赛决赛JAVA真题
下一篇: 计算表达式(上交复试上机)