确定什么进制下乘法式成立(C语言)

      6×9=42,对于十进制来说是错误的,但是对于十三进制来说就是正确的,即6(13) ×9(13)=42(13),而42(13)=4×131+2×130=54(10)。你的任务是编写一段程序读入三个整数p、q和r,然后确定一个进制B(2<=B<=16),使得p×q=r。

如果B有很多选择,则输出最小的一个。例如:p=11,q=11,r=121,则有11(3) ×11(3)=121(3),11(3)=1×31+1×30=4(10)和121(3)=1×32+2×31+1×30=16(10)。对于十进制,有11(10) ×11(10)=121(10)。这种情况下,应该输出3。如果没有合适的进制,则输出0。

输入:从键盘输入三个整数p,q,r,输入0 0 0时结束。
输出:能满足上述表达式的进制。
输入样例:
6 9 42
11 11 121
0 0 0
输出样例:
13
3

#include<stdio.h>
#include<math.h>
#define N 200
int Switch(int m,int R);
int bit(int p,int q,int r,int B);     //判断各个位的数是否在进制范围内 
int main()
{
	int p,q,r,p1,q1,r1;
	int B=2;
	int a[N],num;
	int flag=1;
	int i=0,j=0;
	
	while(1)
	{
		scanf("%d%d%d",&p,&q,&r);
		if(p==0&&q==0&&r==0)              //当输入的三个数全部为0是停止输入 
		break;
		
		for(B=2;B<=16;B++)
		{
			if(bit(p,q,r,B))             //排查三个数各个位的数是否在进制范围内 
		  { 
			p1=Switch(p,B);
			q1=Switch(q,B);
			r1=Switch(r,B);             //将三个数全部转换为十进制 
			
			if(p1*q1==r1)
			{
				num=B;                  //如果等式成立,停止输入 
                break;
			} 
			else num=0;                //若等式不成立则输出0 
          }		
		}
		a[i++]=num;                   
		
		    
	}
	
	for(j=0;j<i;j++)
	printf("%d\n",a[j]);
	
	return 0;
 } 
 
int Switch(int m,int R)
{
	int k=0;
	int n;
	int sum=0;
	while(m)
	{
		n=m%10;
		m=m/10;
		sum=sum+n*pow(R,k);
		k++;
    }
	return sum;
 } 
 
 int bit(int p,int q,int r,int B)
 {
 	int n1,n2,n3;
 	while(p)
 	{
 		n1=p%10;
 		if(n1>=B)
 		return 0;
 		p=p/10;
	 }
	while(q)
	{
		n2=q%10;
		if(n2>=B)
		return 0;
		q=q/10;
	}
	while(r)
	{
		n3=r%10;
		if(n3>=B)
		return 0;
		r=r/10;
	}
	return 1;
 }	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流云枫木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值