思考題 任意長度有理數乘法運算

2022-08-31 09:36:11 字數 2660 閱讀 3515

目標需求:

//描述:

//長數相乘

//請程式設計實現:兩個任意長度的數相乘,請輸出結果.

//詳細要求以及系統約束

//1)兩個數可能是小數、整數、正數、負數;

//2)輸入輸出均為字串形式,輸入的字串以「\0」結束,輸出的結果字串也必須以「\0」結束;

//3)輸入的字串不能是空字串或非法字串,否則返回-1,其他情況返回0;

//4)輸出的結果字串需要過濾掉整數字前以及小數字後無效的0,小數字為全0的,直接輸出整數字;

//例1:相乘結果為11.345,此數值前後均不可以帶0,「011.345」或者「0011.34500」等等前後帶無效0的均視為錯誤輸出。

//例2:080 × 0.125 結果是「10」

//5)輸出的結果如果是正數或0需要過濾掉前面的+號。

//例1:相乘結果為+121,則「+121」為錯誤輸出,「121」為正確輸出。

//輸入:

//輸入兩個任意長度的數

//輸出:

//輸出相乘的結果,如果輸入的數不規範,輸出結果為空

//樣例輸入:

//100000

//500000

//樣例輸出:

//50000000000

思路:首先實現字串加法,去除乘數以及被乘數的小數點,計算結果小數點位置,被乘數逐位與乘數相乘並進行相對的左移位(乘10),然後對這些逐位相乘結果進行相加即可。

得到結果再進行截頭截尾(去除結果字串的開始的0串和小數末尾的0串)。

#include #include #include void str_z(char* s1, char* s2, char **s1z, char **s2z, int *sign)

else

*s1z = s1;

if(s2[0]=='-')

else

*s2z = s2;

*sign = s1sign*s2sign;

}void zheng_xiao_fenli(char *s1, char* s2, int *xiaoshu_cnt, char **s1_num, char **s2_num)

} if(s1_xiaoshu_cnt==0)

else*/

memcpy(*s1_num, s1, sizeof(char)*(s1len-s1_xiaoshu_cnt-1));

memcpy(*s1_num+s1len-s1_xiaoshu_cnt-1, s1+s1len-s1_xiaoshu_cnt, sizeof(char)*s1_xiaoshu_cnt);

*(*s1_num+s1len-1) = '\0';

} for(k2=s2len-1; k2>=0; k2--)

} if(s2_xiaoshu_cnt==0)

else*/

memcpy(*s2_num, s2, sizeof(char)*(s2len-s2_xiaoshu_cnt-1));

memcpy(*s2_num+s2len-s2_xiaoshu_cnt-1, s2+s2len-s2_xiaoshu_cnt, sizeof(char)*s2_xiaoshu_cnt);

*(*s2_num+s2len-1) = '\0';

} *xiaoshu_cnt = s1_xiaoshu_cnt+s2_xiaoshu_cnt;

}char* str_add(char* s1, char* s2)*/

k1 = s1len-1;

k2 = s2len-1;

ansk = anslen-1;

s=0; c=0;

while(k1>=0||k2>=0)

else if(k1>=0)

else if(k2>=0)

} ans[0] = s+'0';

ans[anslen] = '\0';

for(ansk=0; ansk0; k--)

mul_temp_len = strlen(mul_temp);

temp = (char*)malloc(sizeof(char)*(mul_temp_len+s1len-k1));

/*if(temp==null)*/

memset(temp, '0', sizeof(char)*(mul_temp_len+s1len-k1));

memcpy(temp, mul_temp, sizeof(char)*mul_temp_len);

temp[mul_temp_len+s1len-k1-1] = '\0';

free(mul_temp);

mul_temp = temp;

add_temp = str_add(mul_temp, add_temp);

} //printf("%s", add_temp);

return add_temp;

}int main(void)

else

printf("0.");

xs_cnt_temp = xs_cnt-anslen;

while(xs_cnt_temp--)

for(kk=0; kk<=k; kk++)

} else

if(kk!=k-1)

}} }

system("pause");

return 0;

}

結果演示:

討論 思考題

1 功能 編寫函式 float fun 利用以簡單迭代方法 xn 1 cos xn 求方程 cos x x 0 的乙個實根。迭代步驟如下 1 取x1 初值為0.0 2 x0 x1 把x1 的值賦給x0 3 x1 cos x0 求出乙個新的x1 4 若x0 x1 的絕對值小於 0.000001 執行步...

討論 思考題

1 功能 請編寫函式 void fun char s n char b 將 m行n列的二維陣列中的字元資料按列的順序依次放到乙個字串中。例如 二維陣列中的資料為 w w w w s s s s h h h h 則字串中的內容應是 wshwshwshwsh 2 功能 編寫函式 void fun cha...

趣味思考題

1.一間囚房裡關押著兩個犯人。每天監獄都會為這間囚房提供一罐湯,讓這兩個犯人自己來分。起初,這兩個人經常會發生爭執,因為他們總是有人認為對方的湯比自己的多。後來他們找到了乙個兩全其美的辦法 乙個人分湯,讓另乙個人先選。於是爭端就這麼解決了。可是,現在這間囚房裡又加進來乙個新犯人,現在是三個人來分湯。...