C语言《另类的异或》求解!!!大牛们来看看!!!急!!!

FromAdminBegin2-Unit1-另类的异或描述Description对于普通的异或,其实是二进制的无进位的加法这里我们定义一种另类的异或AopB,op是一个仅... From Admin
Begin2 - Unit1 - 另类的异或

描述 Description
对于普通的异或,其实是二进制的无进位的加法
这里我们定义一种另类的异或A op B, op是一个仅由^组成的字符串,如果op中包含n个^,那么A op B表示A和B之间进行n+1进制的无进位的加法。
下图展示了3 ^ 5 和 4 ^^ 5的计算过程

0 1 1(3)
^ 1 0 1(5)
----------
1 1 0(6)

0 1 1(4)
^^ 0 1 2(5)
----------
0 2 0(6)

输入格式 Input Format
第一行有一个正整数T, 表示下面共有T组测试数据。
接下来T行,每行有一组测试数据,是由空格隔开的三个部分组成:
A B C
A和C是两个十进制整数,B是一个字符串,由n个^组成
1 <= T <= 100, 0<=A,B<2^30, 1<=n<=1000

输出格式 Output Format
每个测试数据输出一行,包含一个数字,即该数据的结果,用十进制表示。

样例输入 Sample Input
2
3 ^ 5
4 ^^ 5

样例输出 Sample Output
6
6

时间限制 Time Limitation
各个测试点1s

下面附上我的代码:只过了1个点,不知为何。。。。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
char c[1001];
unsigned long a,b,sum;
int t,i,cs=0,j;
int comp(int m1,int n1)//相信这个谁都能看懂
{
if(m1>n1) return(m1);
else return(n1);
}
unsigned long major(unsigned long a1,int c1,unsigned long b1)//主要程序
{
int max,m=0,n=0,sum1[31]={0},ac[31]={0},bc[31]={0},k;
unsigned long ssum=0;
while(a1!=0)//将a转化为n+1进制的数,存到数组ac[]里
{ac[m]=a1%c1;
a1/=c1;
m++;//位数m
}
while(b1!=0)//将b转化为n+1进制的数,存到数组bc[]里
{bc[n]=b1%c1;
b1/=c1;
n++;//位数n
}
max=comp(m,n);//得到m,n里较大的那个
for(k=0;k<max;k++)//开始做无进位的加法,将结果存到数组sum1[]里
sum1[k]=(ac[k]+bc[k])%c1;
for(k=0;k<max;k++)//开始进行从n+1进制到10进制的转化,结果存在ssum里
ssum+=sum1[k]*pow(c1,k);
return(ssum);//返回其值
}
main()
{
scanf("%d\n",&t);//读入几行
for(i=0;i<t;i++)//进行几次循环
{scanf("%u %s %u",&a,&c,&b);//读入a,^,b
for(j=0;j<1000;j++)//数^的个数,结果存到cs里
if(c[j]=='^') cs++;//简单计数
sum=major(a,cs+1,b);//进入主要程序,cs+1意为n+1进制
printf("%u\n",sum);//输出结果
cs=0;//重置^的个数
}
system("pause");
}
#include<stdio.h>
#include<math.h>
char c[1001];
unsigned long a,b;
int t,i,cs=0,j;
unsigned long major(unsigned long a1,int c1,unsigned long b1
{
int m=0,n=0,ac[31]={0},bc[31]={0},k;
unsigned long ssum=0;
while(a1!=0)//将a转化为n+1进制的数,存到数组ac[]里
{ac[m]=a1%c1;
a1/=c1;
m++;//位数m
}
while(b1!=0)//将b转化为n+1进制的数,存到数组bc[]里
{bc[n]=b1%c1;
b1/=c1;
n++;//位数n
}
for(k=0;k<((m>n)?m:n);k++)//无进位加法并进行进制回转
ssum+=((ac[k]+bc[k])%c1)*pow(c1,k);
return(ssum);//返回其值
}
main()
{
scanf("%d\n",&t);//读入几行
for(i=0;i<t;i++)//进行几次循环
{scanf("%u %s %u",&a,&c,&b);//读入a,^,b
for(j=0;j<1000;j++)//数^的个数,结果存到cs里
if(c[j]=='^') cs++;
printf("%u\n",major(a,cs+1,b));//cs+1意为n+1进制
cs=0;//重置^的个数
}
}
更改后代码 还是不行
展开
 我来答
xiaoqc_cc
2010-10-25
知道答主
回答量:15
采纳率:0%
帮助的人:10.5万
展开全部
#include<stdio.h>
#include<math.h>
char c[1001];
unsigned long a,b;
int t,i,cs=0,j;
double major(unsigned long a1,int c1,unsigned long b1)
{
int m=0,n=0,ac[31]={0},bc[31]={0},k;
double ssum=0;
while(a1!=0)//将a转化为n+1进制的数,存到数组ac[]里
{ac[m]=a1%c1;
a1/=c1;
m++;//位数m
}
while(b1!=0)//将b转化为n+1进制的数,存到数组bc[]里
{bc[n]=b1%c1;
b1/=c1;
n++;//位数n
}
for(k=0;k<((m>n)?m:n);k++)//无进位加法并进行进制回转
ssum+=((ac[k]+bc[k])%c1)*pow(c1,k);
return(ssum);//返回其值
}
void main()
{
scanf("%d\n",&t);//读入几行
for(i=0;i<t;i++)//进行几次循环
{scanf("%u %s %u",&a,&c,&b);//读入a,^,b
for(j=0;j<1000;j++)//数^的个数,结果存到cs里
if(c[j]=='^') cs++;
printf("%.0f\n",major(a,cs+1,b));//cs+1意为n+1进制
cs=0;//重置^的个数
}
}
哥帮你搞定了
修改处
函数变为double型,因为ssum最终算出为double,避免数据丢失
其次主函数中的输出改为%.0f 表示输出double型 小数点后输出0位
记得给分wa
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式