❶ 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。
❷ 用汇编语言怎么实现a的b次方
用循环乘法。汇编里只有基本的加减乘除运算,其它的的数学运算,都是在这4个基本运算的基础上,用算法实现的。
❸ c 求a的b次方
原因楼上的已经说的够明白了,我就不多说了,我给你一个我用数组做的算法,可以达到你的要求,还可以用双链表设计算法,唯一的好处就是可以省些空间,我看以你现在这个代码的话,双链表可能离你还很遥远,所以就选择数组完成。
#include <stdio.h>
#define SIZE 500/* 有效位500 */
void main(void)
{
int i, j, k;
int count;/* 记数变量 */
int flag;/* 记数变量 */
int lenMax;/* 记录数组sum的长度变量 */
int sum[SIZE] = { 0 };/* 过度数组 */
int [SIZE] = { 0 };/* 将数字拆分保存在里面 */
int tmp[SIZE][SIZE] = { 0 };/* 过度数组 */
char result[SIZE] = {'1', '\0'};/* 保存结果 */
int num;/* 幂 */
char data[SIZE] = { '\0' };/* 数 */
printf("数 : ");
gets(data);
printf("幂 : ");
scanf("%d", &num);
/******************************************/
/*****************核心算法*****************/
for (k=0; k<num; k++)/* 幂 */
{
for (i=0; i<SIZE; i++)/* 初始化sum成员(用于累加) */
{
sum[i] = 0;
}//endfor
lenMax = 0;/* 初始化 */
for (i=0; result[i]!='\0'; i++)
{
for (j=0; data[j]!='\0'; j++)
{
tmp[i][j] = (data[j] - '0') * (result[i] - '0');/* 字符形转整形 */
sum[i+j] += tmp[i][j];/* 保存sum[0]到sum[lenMax]值 */
if (lenMax < (i + j))
{
lenMax = i + j;/* 记录数组sum长度 */
}//endif
}//endfor
}//endfor
for (i=lenMax; i>0; i--)/* 对数据进行处理 */
{
if (sum[i] > 9)
{
sum[i-1] += (sum[i] / 10);
sum[i] %= 10;
}//endif
}//endfor
flag = 0;/* 初始化 */
for (i=0; i<=lenMax; i++)
{
count = 0;/* 初始化 */
if (sum[i] < 10)
{
result[flag++] = sum[i] + '0';/* 赋值 */
}//endif
else/* if (sum[i] >= 10)对数据进行拆分 */
{
for ( ; sum[i]>0; sum[i]/=10)
{
[count++] = sum[i] % 10;
}//endfor
for (count--; count>=0; count--)
{
result[flag++] = [count] + '0';/* 赋值 */
}//endfor
}//endelse
}//endfor
result[flag] = '\0';/* 将save做成完整字符串 */
for (i=0; result[i]!='\0'; i++)/* 为验证结论正确打印所有过程以便观察 */
{
putchar(result[i]);
putchar(' ');
}//endfor
printf("\n");
}//endfor
/*******************************************/
printf("\nResult : ");
for (i=0; result[i]!='\0'; i++)/* 最后结果 */
{
putchar(result[i]);
}//endfor
printf("\n\n\n\n\n");
}
如果对你有所帮助,请记得采纳最佳答案,谢谢!
❹ C语言求A的B次方
scanf("%f%f",&a,&b); 改为 scanf("%lf%lf",&a,&b);
printf("%f",c);改为 printf("%lf",c);
因为你的a,b,c是double类型的,所以用"%lf"而不是"%f"
❺ 编写程序求a的b次方,运用递归函数和主函数
#include<stdio.h>
double a_b(double x,int n)
{
if(n==0)return 1;
else return x*a_b(x,n-1);
}
int main()
{ double a;
int b;
scanf("%lf %d",&a,&b);
printf("%g^%d=%g ",a,b,a_b(a,b));
system("pause");
}
❻ 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);
}