首页 > 代码库 > timus 1095 Nikifor 3【思路】

timus 1095 Nikifor 3【思路】

传送门:timus 1095

题意:给出一个数字(可能是大数),其中1,2,3,4每个数至少出现一次,将大数数字重新排列,输出一个能被7整除且不以0为前缀的结果,如果没有,则输出0

思路:

利用1,2,3,4至少出现一次的信息先枚举一下他们的组合mod7的情况,因为所有整形数mod7结果只能出现7种情况

7是一个不一般的数啊 不一般体现在这里

( 10%7=3

  20%7=6

  30%7=2;

  40%7=5;

  50%7=1;

  60%7=4;)

这个可以先通过写测试代码来模拟相应的结果

 int i,j,k,h,sum;
   bool map[7];  //标记是否已有满足条件的数
   char comb[7][10]; 
   memset(map,false,sizeof(map));
   for(i=1;i<=4;i++)
     for(j=1;j<=4;j++)
       for(k=1;k<=4;k++)
         for(h=1;h<=4;h++)
           if(i!=j&&i!=k&&i!=h&&j!=k&&j!=h&&k!=h){ 
              sum=i*1000+j*100+k*10+h;
			  if(map[sum%7]==false){
				  map[sum%7]=true;
				  comb[sum%7][0]=i;
				  comb[sum%7][1]=j;
				  comb[sum%7][2]=k;
				  comb[sum%7][3]=h;
				  comb[sum%7][4]='\0';
			  }
		   }
    for(i=0;i<7;i++){
       if(map[i])printf("mod7余%d:%s\n",i,comb[i]);
	   }
输出发现0~6都有对应的comb值

这说明什么?尽在不言中!

前缀不能为0,那把所有0安排在最后面

1,2,3,4每个数留一个做最后的判断,

像 11112345670

就可以先求出111567的余数,把0放到最后(嗯,看到这里应该不用再说下去了,已经显而易见该怎么弄了吧!)

是不是可以再把题目改编一下,如果输出结果是大数能被9整除呢?

(这个应该是更简单的!呼呼,比较杂乱的推理)


timus 1095 Nikifor 3【思路】