问题
6 × 9 = 42 对于十进制来说是错误的,但是对于 13 进制来说是正确的。即,6 (13) × 9 (13) = 42 (13), 而 42 (13) = 4 × 13 + 2 = 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)。对于进制 10,有 11 (10) × 11 (10) = 121 (10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。
我的代码
#include<stdio.h>
#include<math.h>
int jinzhi(double n,int a[]);
int main(void)
{
int a[7],b[7],c[7];
int n;
double z;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int j=0,k=0,l=0;
while(scanf("%d",&a[j++])&&a[j]!=' ')
while(scanf("%d",&b[k++])&&b[k]!=' ')
while(scanf("%d",&c[l++])&&c[l]!=' ')
for(z=2;z<=16;z++)
{
if(jinzhi(z,c[])==jinzhi(z,b[])*jinzhi(z,a[]))
printf("%lf\n",z);break;
}
if(z==17)
printf("0\n");
}
}
int jinzhi(double n,int a[])
{
int i,j;
double c=0;
for(i=0;a[i]!='0';i++,c++)
{
j+=pow(n,c)*a[i];
}
return j;
}
错误的是这一行
if(jinzhi(z,c[])==jinzhi(z,b[])*jinzhi(z,a[]))
你的形参是数组,你这里写的实参是啥?既不是地址,也不是数值,地址的话直接c,不用[],或者&c[i]之类的;数值的话你又没有指定下标,而且传数值肯定报错,形参和实参类型不一样。还有其他的逻辑问题,我这里直接无限输入
你把你的思路说一下,以及这个题目给的例子输入输出写一下,你的三个while循环那里有问题
思路还是很清晰的。
其实出错的地方就在语法上。如果函数参数是数组的话,调用的时候直接写数组名就可以。比如说:int get(int a[]),调用的时候只用写成get(a)的格式就可以。如果写成a[]形式的话编译器就会认为这是一个二维数组,与a数组的定义不同,所以会编译错误。
#include<stdio.h>
#include<math.h>
#include<string.h>
int jinzhi(int n, char a[]);
int main(void)
{
char a[7] = {0};
char b[7] = {0};
char c[7] = {0};
int n;
int z;
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
int flag = 0;
scanf("%s", a);
scanf("%s", b);
scanf("%s", c);
for(z = 2; z <= 16; z++)
{
int m = 0, j;
for(j = 0; a[j] != '\0'; j++)//进制不符
if((a[j]-'0') >= z)
m++;
for(j = 0; b[j] != '\0'; j++)//进制不符
if((b[j]-'0') >= z)
m++;
for(j = 0; c[j] != '\0'; j++)//进制不符
if((c[j]-'0') >= z)
m++;
if(m == 0 && jinzhi(z,c) == jinzhi(z,b) * jinzhi(z,a)){
flag = z;
break;
}
}
printf("%d\n", flag);
}
}
int jinzhi(int n, char a[])
{
int i, j = 0;
int c = 0;
for(i = strlen(a)-1; i >= 0; i--, c++)
{
j += pow(n,c) * (a[i] - '0');
}
return j;
}