中易网

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

答案:1  悬赏:80  
解决时间 2021-01-30 07:47
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
#include
#include
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 sum1[k]=(ac[k]+bc[k])%c1;
for(k=0;k ssum+=sum1[k]*pow(c1,k);
return(ssum);//返回其值
}
main()
{
scanf("%d\n",&t);//读入几行
for(i=0;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
#include
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 {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;//重置^的个数
}
}
更改后代码 还是不行
最佳答案
#include
#include
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 {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
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
电脑的usb接口没问题,但是机械键盘连在上面
男友对我花钱不主动,什么心理
急!从深圳横岗到广州夏茅要多少钱车费?
估算. 799×6≈ 9×301≈ 79÷4≈ 73
最近刷了Win10,雨滴支持吗
关于撤销权
笔记本可以到专卖店去维修吗??
一般网络作家都用什么输入法?
最近手机怎么不能投到电视机
她迷人又危险小说百度云完整版
农村水质问题
sql查出重复数据
龟兔进行10000米跑步比赛,兔每分钟跑400米 龟
她说天知道。我难过了都是自己想通了。自己走
7月到桂林,有什么必玩景点推荐
推荐资讯
感恩婆婆辛苦的一句话
为什么我说话别人就是不感兴趣?我融不进他们
feel后面加动词原形还是ing 不要说feel like
iPhone照片是在无wifi的情况下照的,等到了有w
心要让你看见爱要让你听见是什么歌
侠盗飞车罪恶都市让车晃动
靠马路边的房子吵不吵
想入手大疆精灵3se 听说图传很卡 有吧友在用
女主在宴会上弹琴,男主吹箫和着的穿越小说
梦幻西游杀三界赚钱吗?
消防图了符号怎么认
家里飞进一只孔雀是什么兆头,求懂风水易象的
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?