7-42 整除光棍 (20分)之模拟除法

7-42 整除光棍 (20分)

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:
输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:
在一行中输出相应的最小的s和n,其间以1个空格分隔。

输入样例:
31

输出样例:
3584229390681 15


/*最开始的笨方法是想遍历’光棍’数直接 对输入数x求余,整除的结果,
但是满足答案的光棍数超过整数变量所能表达的位数20位,故经网络搜索后得到一非常棒的解决方法,
洞悉了本题的规律
详见https://blog.csdn.net/diviner_s/article/details/105298569
和https://blog.csdn.net/qq_37729102/article/details/81545005所提供的解题思路模拟除法,仔细分析除法的本质,
每除一次,若除不尽,则余数作被除数且加一位1 */ 
//#include <stdio.h>
//int main()
//{
//	int N,i,j,flag=1,cnt=0;
//	unsigned long long num=0,number1=0,number2=0;
//	double resu=0.0;
//	scanf("%d",&N);
//	
//		num=11;//这里是易错点,记得要将变量初始化 
//		for(j=3;j<=20;j++)
//		{
//			num=num*10+1;
//		    flag=num%N;//用来标记所输入数被该光棍数整除 
//		    if(flag==0)
//		    {
//		    	number1=num/N;//umber1即被光棍数所整除的结果 
//		    
//		    	break;
//			}
//		}
//		
//统计位数 
//		do{
//			num/=10;
//			cnt++;
			printf("cnt=%d\n",cnt);
//		}while(num>0);
//		printf("num=%llu %d\n",number1,cnt);
//
//
//	return 0;
//}
#include <stdio.h>
int main()
{
	int x,bchu=0,cnt=0,s;
	scanf("%d",&x);
	//确保被除数bchu大于所输入数 
	while(bchu<x)
	{
		bchu=bchu*10+1;
		cnt++;
	}
	// 每除一次,若除不尽,则余数作被除数且加一位1
	while(1) 
	{
		s=bchu/x;
		printf("%d",s);//输出商的一位 
		bchu=bchu%x;//余数作被除数
		if(bchu==0)
		{
			break;
		 } 
		 bchu=bchu*10+1;//余数作被除数且加一位1
		 cnt++;//统计1的个数 
	}
	printf(" %d",cnt);
	return 0;
}


备注:因为本代码是参考搜索网络上别人的思路方法,因此,也将自己整理的代码分享出来。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值