菜蛙


私信TA

用户名:hu2022

访问量:16293

签 名:

明日复明日,明日何其多。我生待明日,万事成蹉跎。

等  级
排  名 548
经  验 4387
参赛次数 0
文章发表 75
年  龄 0
在职情况 学生
学  校 哈工程
专  业

  自我简介:

题目:

一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。

又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。

求这个自然数。


解题思路:

1.根据题目提示,推算出可能符合条件的最小自然数num,缩小范围:

题目中被17除余的条件中说到“最后得到一个商是a的2倍”,由此可知a必然大于0。

取a=1,则自然数num除以17的商,再除以17的商为2。

那么此时num=(17*2+15)*17+4=837,也就是说可能符合条件的最小自然数为837。

2.根据被8除余的条件,依次使用判断语句,判断num是否符合该条件——

    2.1.num首先对8求余,若余数为1,则进行2.2的判断

    2.2.num除以8得到一个商,该商对8求余,若余数为1,则进行2.3的判断

    2.3.用num除以8得到的商,再除以8得到新商,该新商对8求余,若余数为7,则进行2.4

    2.4.用2.3中得到的新商除以8,得到的第三个商,即题目中表述的“最后得到一个商为a”中的a

    2.5.判断a是否大于0,若大于0则改变标记变量停止循环,并将a的值返回给主函数;否则弃之,num自增1重新开始判断

3.根据被17除余的条件,依次使用判断语句,判断num是否符合该条件,与第二步类似,不再赘述。

4.在主函数中,根据接收到的返回值,分别推算出两个函数中各自产生的自然数,记为num1、num2:

通过dbe、dbs、num1、num2分别记录被8除余得到的商、被17除余得到的商、8对应的自然数、17对应的自然数,可以有效减少函数的调用,提高程序的效率。

5.若17中商dbs是8中商dbe的2倍,且两个函数中产生的自然数num1和num2相等,输出这个自然数,结束程序即可

6.否则,将两个自然数中更小的那个+1后,再赋值给num ,再从第二步开始重复操作即可


参考代码:

#include<stdio.h>

int DivideByEight(int num){
	int a,mark=1;
	while(mark==1){
		if(num%8==1){                  //若自然数num被8除余1,则继续判断 
			if((num/8)%8==1){            //若第一步所得的商,也被8除余1,则继续判断 
				if(((num/8)/8)%8==7){      //若第二步所得的商,被8除余7,则将三次被8除后的商赋值给a 
					a = ((num/8)/8)/8;
					if(a>0){        //a被赋新值之后,判断其是否符合题意 
					mark = 0;
					}
				}
			}
		}
		num++;                     //以上判断未全部通过,则自然数自增1,重复判断 
	}
	
	return a;
}

int DivideBySeventeen(int num){
	int a,mark=1;
	while(mark==1){
		if(num%17==4){
			if((num/17)%17==15){
				a = (num/17)/17;
				if(a>0){
					mark = 0;	
				}
				
			}
		}
		num++;
	}
	
	return a;
}

int main(void){
	int num=837;                   //根据题意,可能符合条件的最小的自然数为837 
	int mark=1;
	int result;
	int num1,num2;
	int dbe,dbs;
	
	while(mark==1){
		dbe = DivideByEight(num);         //被8除三次后得到的商
		dbs = DivideBySeventeen(num);      //被17除两次后得到的商
		num1 = ((17*dbs+15)* 17+4) + 1;    //推算出此时DivideBySeventeen函数中对应的num值,并加1 
		num2 = (((8*dbe+7)* 8+1)* 8+1) + 1; //推算出此时DivideByEight函数中对应的num值,并加1 
		
		if(((2*dbe)==dbs)&&(num1==num2)){
			result = (17*dbs+15)* 17+4;  //这里用17或是8来推算均可 
			printf("%d",result);
			mark = 0;
		}
		
		else{                  //若不是要找的自然数,则将两个自然数中小的那个+1后,再赋值给num 
			if(num1>num2){
				num = num2;
			}else{
				num = num1;
			}
		}
	}
	
	return 0;
}


 

0.0分

11 人评分

  评论区

  • «
  • »