❶ 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);
}