㈠ c语言编写计算a的b次方的函数
这个算法,其实就是用连乘来实现乘方。只是在连乘的中间的每一步都用除以c的余数来代替原数。
之所以可以如此做,是因为整数有如下性质可以利用:
如果x除以c的余数是x,那么(x*y)和(x*y)各除以c,余数相等。
故作乘法时用x代替x,积除以c的余数不变。
这个性质的道理不难理解:考虑(x*y)和(x*y)的差:等于(x-x)*y。而(x-x)显然是c的整数倍,y也是整数,故(x*y)和(x*y)的差是c的整数倍,所以(x*y)和(x*y)各除以c,余数相等。
这个算法的好处是:中间的每一步都用除以c的余数来代替原数,可以防止中间结果过大,从而不会溢出。如果不这样做,而是直接求乘方,那么中间是很容易溢出的。
如果直接用pow函数,缺点是pow函数参数和返回值都是实型数,存在误差,而c语言强制类型转换取整又是只舍不入,需在程序中适当处理防止结果可能错1。
㈡ c语言中怎样写a的b次方,高手,请将整个程序写出来。谢谢
#include <stdio.h>
int f(int x,int y);
int main()
{
int a,b;
printf("输入两个正整数:");
scanf("%d %d",&a,&b);
printf("a的b次方=%d\n",f(a,b));
return 0;
}
int f(int x,int y)
{
if(y==1)return x;
else
return x*f(x,y-1);
}
㈢ c语言中a=a^b;这个语句是怎么计算的,举个例子说明
参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0,
1^0=1,
0^1=1,
1^1=0
例如:10100001^00010001=10110000
0^0=0,0^1=1
0异或任何数=任何数
1^0=1,1^1=0
1异或任何数-任何数取反
任何数异或自己=把自己置0
(1)按位异或可以用来使某些特定的位翻转,如对数10100001的第2位和第3位翻转,可以将数与00000110进行按位异或运算。
10100001^00000110=10100111
//1010
0001
^
0x06
=
1010
0001
^
6
(2)通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。例如交换两个整数a,b的值,可通过下列语句实现:
a=10100001,b=00000110
a=a^b;
//a=10100111
b=b^a;
//b=10100001
a=a^b;
//a=00000110
(3)异或运算符的特点是:数a两次异或同一个数b(a=a^b^b)仍然为原值a.
㈣ C语言 ,求 a的b次方, 求大神看看错在哪里/
我给你个参考程序吧。
#include<stdio.h>
void main()
{
int
a,b,i;
scanf("%d
%d",&a,&b);
i=1;//原程序中你把i=a;一进入while逻辑算法就错了
while(b);//原程序中while(b>1);就算你之前的逻辑算法是对的,也只能得到a^(b-1)的值,因为漏了b=1这次
{
i*=a;
b-=1;
}
printf("%d\n",i);
}
㈤ c语言题目,求a的b次方,0<=a,b<=10000,a、b不同时为0。多组数据。求纠错
你的程序错的
while(b--)
{
a=a*a;
while(a/10)
{
a=a/10;
}
}
这题由于b太大,long long都存不下这个数,所以要用高精度来做,高精度乘法就是把一个数分成很多个来乘
比如有一个数456123789654,这是我们把它存在一个数组里a[],
a[0]=4,a[2]=5,a[3]=6,a[4]=1,a[5]=·····················
在按你小学学乘法的方法一位一位的乘
如123456乘3654,就先用4乘每一位,在用5乘每一位,这样就可以了,望采纳
如果是求末尾,那a=a/10后s=a%10就可以了,输出s
不对,应该a=a%10;最后输出a,应该这样
㈥ c语言数组求幂谢谢
#include<stdio.h>
#include<string.h>
int poll(int a,int b)
{
int i,s=1;
for(i=1;i<=b;i++)
s=s*a;
return s;
}//自定义的求幂函数
int main()
{
int i,j,k,l,n,m;
int t;
char a[100];
int poll(int a,int b);
while(scanf("%d %s",&n,a)!=EOF)//输入
{
t=0;
l=strlen(a)-1;
printf("%d\n%s\n",n,a);//将输入输出
for(i=0;a[i]!='\0';i++)//转换过程
{
if(n!=16)
{
t=t+(a[i]-'0')*poll(n,l);
l--;
}
else
{
if(a[i]>='A'&&a[i]<='f')
t=t+(a[i]-'A'+10)*poll(n,l);
else
t=t+(a[i]-'0')*poll(n,l);
l--;
}
}
printf("%d\n",t);//所求的结果
}
}
这个代码没有问题,不懂的话,在问我吧
其中n就是2或8或16,也可以是别的数,而a[]就是与n相对应的进制数
下面是输入输出样例
2 10101010110
2
10101010110
1366
8 777777777
8
777777777
134217727
16 F08F89FAD
16
F08F89FAD
150511533